Обработка deadlock в Doctrine
Проблему взаимных блокировок в первую очередь надо решать исходя из контекста, где они возникают. Однако если дедлоки стреляют изредка, можно предусмотреть простой retry. Удобнее всего его реализовать как middleware для command bus и там поймать
Помните, что после ошибки EntityManager закрывается. В Symfony его можно оживить вызовом метода
Пример такого middleware для Symfony Messenger: https://gist.github.com/vudaltsov/945291b4e8a8800f669d478c8d66e8b8
Проблему взаимных блокировок в первую очередь надо решать исходя из контекста, где они возникают. Однако если дедлоки стреляют изредка, можно предусмотреть простой retry. Удобнее всего его реализовать как middleware для command bus и там поймать
Doctrine\DBAL\Exception\RetryableException
.Помните, что после ошибки EntityManager закрывается. В Symfony его можно оживить вызовом метода
resetManager()
на сервисе @doctrine
(автовайрится по интерфейсу Doctrine\Persistence\ManagerRegistry
). После этого менеджер даже в извлеченном из контейнера сервисе не кинет The EntityManager is closed
благодаря замене инициализатора в прокси.Пример такого middleware для Symfony Messenger: https://gist.github.com/vudaltsov/945291b4e8a8800f669d478c8d66e8b8