Разделение транзакций между двумя разными шинами в мессенджере symfony при возникновении ошибки в первой. - PullRequest
2 голосов
/ 20 июня 2020

Допустим, у нас есть следующий код:

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 должен обеспечивать такое выполнение без вмешательства разработчика.

...