Armazenamento de bloqueio (lock) com base no PDO adicionado no Symfony 4.2

O Componente Lock foi introduzido no Symfony 3.4 para criar e gerenciar bloqueios (locks), um mecanismo para fornecer acesso exclusivo a um recurso compartilhado. Ele já suporta diferentes armazenamentos para locks locais (arquivos, semáforos) e locks distribuídos (Memcache, Redis). No Symfony 4.2, foi adicionado um novo armazenamento de lock baseado no PDO.

Isso faz sentido porque a maioria das aplicações Symfony já usam o MySQL/MariaDB ou PostgreSQL para persistência de dados. No entanto, esse novo armazenamento não depende dos mecanismos de lock desses bancos de dados (pg_advisory_lock_shared para PostgreSQL e GET_LOCK para MySQL/MariaDB) porque eles não são confiáveis o suficiente. Eles dependem da conexão TCP e precisam ajustar o mecanismo do banco de dados para não aceitar novas conexões após uma reinicialização ou para definir um tempo limite de conexão maior que a duração máxima do lock.

A nova classe PdoStore requer um objeto PDO, um objeto de conexão DBAL do Doctrine ou uma string DSN (Data Source Name) para configurar o armazenamento:

use Symfony\Component\Lock\Store\PdoStore;

// a PDO, a Doctrine DBAL connection or DSN for lazy connecting through PDO
$databaseConnectionOrDSN = 'mysql:host=127.0.0.1;dbname=lock';
$store = new PdoStore($databaseConnectionOrDSN, [
'db_username' => 'myuser',
'db_password' => 'mypassword'
]);

Em seguida, crie a tabela que armazena as informações de lock. Você pode usar o método createTable() da classe PdoStore para fazer isso:

try {
$store->createTable();
} catch (\PDOException $exception) {
// the table could not be created for some reason
}

Agora você pode criar e gerenciar locks baseados em PDO, conforme explicado nos documentos de qualquer outro tipo de lock.

Tradução de: New in Symfony 4.2: PDO-based lock storage