如何在事务提交后才执行某个方法
如何在事务提交后才执行某个方法
开发过程中经常出现如下场景;
新增一篇文章,然后发一个广播mq出去;
广播监听者监听到消息然后根据文章id回查文章内容;
但是此时新增文章的方法的事务还没有提交,根据id回查数据库的时候查到数据为空。
代码如下:
@Transactional
public void add文章() {
//insert文章
//sendmq
}
此时我们希望的效果是,等事务提交之后再发mq。
可以改成如下写法:
public void add文章() {
//insert文章
//sendmq
}
@Transactional
public void insert文章() {
//insert文章
}
但是这样每次涉及这样的业务都需要包一层,而且很多时候并不知道调用add文章的外层是否还有@Transactional
注解
我们希望达到的效果是注册一个mq事件,等事务提交后再出发我们的mq事件
。
TransactionSynchronizationManager
嵌入如下代码,可以注册一个事务事件,在事务提交之后才出发我的方法。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
System.out.println("a");
}
});
总的写法如下:
@Transactional
public void add文章() {
//insert文章
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//sendmq
}
});
}
这样mq的方法就会在事务提交后才出发。这样回查的时候就不会空了。
注意,如果是读写分离的数据库数据同步的延时,该方法不能解决,还是会查到空值。此时就要用延时队列的办法解决问题。
欢迎关注我的公众号:“从零开始的it转行生”