让我们考虑以下上下文:
2 个 spring 集成通道,它们分别位于单独的数据库事务中。在第一个事务结束时,一条消息被放入第二个通道。在第一个通道中,在数据库中创建元素,这些元素稍后被从第一个通道发送到第二个通道的相应消息使用。
为了确保通道 1 的事务在触发第二个通道之前完全提交,我们的子类JpaTransactionManager
在TransactionSynchronization
它prepareForCommit
从JpaTransactionManager
流程(通道 1)如下所示:
做所有的消息处理和数据库处理
流程的最后一步注册 a在阶段TransactionSynchronization
中执行 a以将消息发送到通道 2MessageChannel.send
afterCommit
我的理解是,在将消息发送到第二个通道(in afterCommit
)时,通道 1 的数据库事务中所做的所有更改都被刷新并提交。
现在第二个通道做了一些工作(如 MQ PUT),然后更新在第一个流中创建的条目。我们现在观察到存储库方法在数据库中没有返回任何条目,但稍后它在表中可见。然而,在第一个通道的事务中也创建的其他条目是可见的。这种情况每隔几千条消息才会发生一次,通常它们在那里,但有时它们在通道 1 提交事务几毫秒后对第二个通道不可见。
我创建了一个应该说明它的图像:
这Chain 1
是第一个由多个ServiceActivators
执行数据库工作的链组成的链,一个生成更多消息的拆分器,然后是另一个ServiceActivator
我命名的链,SENDER
它注册了TransactionSynchronization
(所以我的理解)应该在红色事务之后将例如 3 个生成的消息发送到链 2已完全提交,因此在蓝色事务开始之前。
我注意到的一件事是,有时存在但有时不存在的条目都在(不是故意)使用的一种方法中,javax.transaction.Transactional
而不是org.springframework.transaction.annotation.Transactional
. 但是,我们使用的是spring core 5.0.8.RELEASE,在其他问题中,我已经看到自spring 4.2.x以来这应该产生0差异。
拉风的咖菲猫
相关分类