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

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

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

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

你可能感兴趣的:(如何在事务提交后才执行某个方法)