Php 在symfony messenger中,当第一条总线出错时,将两条不同总线之间的事务分离

Php 在symfony messenger中,当第一条总线出错时,将两条不同总线之间的事务分离,php,symfony,doctrine,symfony-messenger,Php,Symfony,Doctrine,Symfony Messenger,假设我们有以下代码: try { $message = new CreateSomething($data); $this->messageBus->dispatch($message); } catch (RuntimeException $exception) { $failNotification = new CreateFailedNotification($data); $this->eventB

假设我们有以下代码:

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
期间持久化的实体,因此最后这些实体也会被保存到DB中,这是不需要的行为

我已经读过了

当使用显式事务划分并发生异常时,应立即回滚事务,并通过调用EntityManager#close()关闭EntityManager

DoctrineTransactionMiddleware不这样做-在执行
eventBus
分派之前,我必须在catch块中显式执行
close()
方法-然后我从
messageBus
中删除不需要的实体。也许我理解错了,它就是这样工作的,或者DoctrineMiddleware错过了executeclose()方法。IMO DoctrineTransactionMiddleware应该在没有开发人员干预的情况下提供这样的执行