如何在事务提交后才执行某个方法

如何在事务提交后才执行某个方法

开发过程中经常出现如下场景;
新增一篇文章,然后发一个广播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的方法就会在事务提交后才出发。这样回查的时候就不会空了。

注意,如果是读写分离的数据库数据同步的延时,该方法不能解决,还是会查到空值。此时就要用延时队列的办法解决问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。