为了账号安全,请及时绑定邮箱和手机立即绑定

事务中的更改子集有时在提交后不久不可见

事务中的更改子集有时在提交后不久不可见

翻翻过去那场雪 2022-06-15 16:01:39
让我们考虑以下上下文:2 个 spring 集成通道,它们分别位于单独的数据库事务中。在第一个事务结束时,一条消息被放入第二个通道。在第一个通道中,在数据库中创建元素,这些元素稍后被从第一个通道发送到第二个通道的相应消息使用。为了确保通道 1 的事务在触发第二个通道之前完全提交,我们的子类JpaTransactionManager在TransactionSynchronization它prepareForCommit从JpaTransactionManager流程(通道 1)如下所示:做所有的消息处理和数据库处理流程的最后一步注册 a在阶段TransactionSynchronization中执行 a以将消息发送到通道 2MessageChannel.sendafterCommit我的理解是,在将消息发送到第二个通道(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差异。
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我认为这不是afterCommit向下游发送消息的正确位置。

应该有足够的服务激活器来标记 POJO 方法@Transactional。这样,事务将完全围绕此方法调用开始和结束。该方法的结果将被发送到输出通道,恰好在该事务提交之后。

更新

实现您的要求的最佳方式是<gateway>围绕您的 Chain1。这样,TX 将在那里提交,然后再从网关生成对 Chain2 的回复。

TransactionSynchronization::afterCommitQueueChannel 准备好轮询消息时,不能保证 TX 将在 DB 上提交。虽然您可以JdbcChannelMessageStore用于消息的事务性存储。这样,在数据库中的 TX 提交之前,它们将不可见。

<gateway>在文档中查看更多信息: https ://docs.spring.io/spring-integration/docs/current/reference/html/messaging-routing-chapter.html#_calling_a_chain_from_within_a_chain


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号