September 21, 2018 Javier Eguiluz

The Lock component was introduced in Symfony 3.4 to create and manage locks, a mechanism to provide exclusive access to a shared resource. Out of the box it supports different storages for local locks (files, semaphores) and distributed locks (Memcache, Redis). In Symfony 4.2 we've added a new PDO-based lock storage.

This makes sense because most Symfony applications already use MySQL/MariaDB or PostgreSQL for data persistence. However, this new storage doesn't rely on the built-in locking mechanisms of those databases ( pg_advisory_lock_shared for PostgreSQL and GET_LOCK for MySQL/MariaDB) because they are not reliable enough. They depend on the TCP connection and require to fine-tune the database engine in order to not accept new connections after a reboot or to define a connection timeout greater than the maximum lock duration.

The new PdoStore class requires a PDO object, a Doctrine DBAL Connection object or a DSN (Data Source Name) string to configure the storage:

1 2 3 4 5 6 7 8 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' ]);

Then, create the table that stores the lock information. You can use the createTable() method of the PdoStore class to do that:

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

Now you can create and manage the PDO-based locks as explained in the docs for any other lock type.