Допустим, у нас есть следующий код:
try {
$message = new CreateSomething($data);
$this->messageBus->dispatch($message);
} catch (RuntimeException $exception) {
$failNotification = new CreateFailedNotification($data);
$this->eventBus->dispatch($failNotification);
throw $exception;
}
Обе шины установили DoctrineTransactionMiddleware. Предположим, что во время обработки процессов внутри messageBus
мы сохраняем некоторые сущности, но возникает исключение - DoctrineTransactionMiddleware
обеспечивает откат транзакций в этой ситуации, поэтому позже мы попадаем в блок catch в приведенном выше коде. В eventBus
все обрабатывается нормально, поэтому транзакция, созданная в eventBus
, успешно зафиксирована, но entityManager также имеет сущности, которые сохранялись во время messageBus
, поэтому, наконец, эти сущности также сохраняются в БД, что нежелательно
Я читал в doctrine документации , что
При использовании явной демаркации транзакции и возникновении исключения транзакция должна быть немедленно отменена а EntityManager закрывается путем вызова EntityManager # close ()
DoctrineTransactionMiddleware этого не делает - я должен явно выполнить метод close()
в блоке catch перед выполнением eventBus
отправки - тогда я избавился нежелательные сущности из messageBus
. Возможно, я неправильно понимаю идею, и она просто работает так, ИЛИ DoctrineMiddleware пропускает метод execute close (). IMO DoctrineTransactionMiddleware должен обеспечивать такое выполнение без вмешательства разработчика.