![]() ![]() The solution is to remove indices on the `queue_name` and `available_at` columns. Symfony\Component\Console\Application->run() at /var/www/bin/console:42Ī similar problem with Laravel's queue worker (and a solution) is reported here: laravel/framework#31660 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /var/www/vendor/symfony/console/Application.php:149 Symfony\Component\Console\Application->doRun() at /var/www/vendor/symfony/framework-bundle/Console/Application.php:83 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /var/www/vendor/symfony/console/Application.php:273 Symfony\Component\Console\Application->doRunCommand() at /var/www/vendor/symfony/framework-bundle/Console/Application.php:97 Symfony\Component\Console\Command\Command->run() at /var/www/vendor/symfony/console/Application.php:1027 ![]() Symfony\Component\Messenger\Command\ConsumeMessagesCommand->execute() at /var/www/vendor/symfony/console/Command/Command.php:255 Symfony\Component\Messenger\Worker->run() at /var/www/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php:202 Symfony\Component\Messenger\Worker->handleMessage() at /var/www/vendor/symfony/messenger/Worker.php:81 ![]() Symfony\Component\Messenger\Transport\Doctrine\DoctrineTransport->ack() at /var/www/vendor/symfony/messenger/Worker.php:150 Symfony\Component\Messenger\Transport\Doctrine\DoctrineReceiver->ack() at /var/www/vendor/symfony/messenger/Transport/Doctrine/DoctrineTransport.php:50 Symfony\Component\Messenger\Transport\Doctrine\Connection->ack() at /var/www/vendor/symfony/messenger/Transport/Doctrine/DoctrineReceiver.php:79 SQLSTATE: Serialization failure: 1213 Deadlock found when trying to get lock try restarting transactionĪt /var/www/vendor/symfony/messenger/Transport/Doctrine/Connection.php:227 After a while, several consumers report a deadlock:Īn exception occurred while executing 'DELETE FROM messenger_messages WHERE id = ?' with params : Create a command that dispatches 10000 of these messages in a for loop en start 4 message consumers. This can be reproduced consistently by setting up a default `async` queue with the Doctrine transport and creating an empty `TestMessage` and `TestMessageHandler`. Using Doctrine transport with multiple consumers occasionally results in MySQL deadlocks while removing a message from the messages database table. Removing indices on queue_name and available_at This might cause deadlocks when running multiple workers. Since locking rows and indices is not one atomic operation, FOR UPDATE locks rows but also relevant indices. Remove indices in messenger table on MySQL to prevent deadlocks while removing messages when running multiple consumers …prevent deadlocks while removing messages when running multiple consumers (jeroennoten) Acquiring those two locks is not atomic and if another worker releases the job by executing the delete statement in between, it can acquire the lock between those 2 actions and create a deadlock.Ĭan somebody test this and confirm that the findings are correct? When a queue job tries to reserve a new job by running SELECT.FOR UPDATE, it must get 2 locks on both indexes (id and queue).
0 Comments
Leave a Reply. |