SpringBoot事务提交后执行后续操作

SpringBoot事务提交后执行后续操作

业务场景

业务需求上经常会有一些边缘操作,比如主流程操作A:用户报名课程操作入库,边缘操作B:发送邮件或短信通知。

业务要求

  • 操作A操作数据库失败后,事务回滚,那么操作B不能执行。
  • 操作A执行成功后,操作B也必须执行成功

如何实现

  • 普通的执行A,之后执行B,是可以满足要求1,对于要求2通常需要设计补偿的操作
  • 一般边缘的操作,通常会设置成为异步的,以提升性能,比如发送MQ,业务系统负责事务成功后消息发送成功,然后接收系统负责保证通知成功完成

实现方案

使用TransactionSynchronizationManager在事务提交之后操作

@Component
public class CallBackService {

    public void execute(final CallBackAction action) {

        if (TransactionSynchronizationManager.isActualTransactionActive()) {
            TransactionSynchronizationManager
                    .registerSynchronization(new TransactionSynchronizationAdapter() {
                        @Override
                        public void afterCommit() {
                            // 事务提交后执行回调
                            action.callback();
                        }
                    });
        } else {
            // 事务提交后执行回调
            action.callback();
        }

    }

}
public interface CallBackAction {
    /**
     * 普通事务回调
     */
    void callback();
}
  • 有了上述两个类,就可以实现在一个事务提交后将消息发送到队列或是其他操作,具体操作如下

  • 假设在一个业务下,往数据库插入了一条记录,然后向队列发送一条消息

@Override
@Transactional()
public void save() {
    User user1 = new User();
    User user2 = new User();
    userMapper.insert(user1);
    userMapper.insert(user2);
    // 在事务提交后执行
    callBackService.execute(() -> {
        // ...
    });
}

你可能感兴趣的:(SpringBoot事务提交后执行后续操作)