如何实现提交数据库事务之后,再发送mq
来源:

木星鸽_手机
2018-09-21
项目中遇到一个问题,上游业务修改订单状态之后,发送一个订单状态变更的广播出来,各个下游业务监听该topic完成后续业务,如果mq发生太快,数据还没入库,下游获取的是旧的状态。
怎样才能保证写表之后,发送mq呢
写回答
1回答
-
正常的情况下,我们可以使用默认的方式进行DB和MQ的两个数据源的事务管理,这样的话,在DB的事务提交的时候,再触发MQ的事务的提交。这样,MQ上的消息触发其他的业务过程中,读数据库肯定读到的是已经提交的状态。
但是,如果使用Spring Data或Hibernate之类的框架,在你提交事务是时候,这个框架不会立刻把数据状态提交到DB上,而是保存在它的context中。之前我们就遇到过,使用Spring Data时,你说的那种问题。即使在方法结束前使用repository的flush()方法,也没有立刻提交到DB。
Spring Data的这种机制是为了在单服务的情况下,更有效的利用缓存。但是在分布式环境下,就会造成问题。
这种情况下,你试一下用代码方式进行管理事务,而不是用@Transactional的标签。然后也尝试一下repository的flush()方法。
022018-09-23
相似问题