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(() -> {
// ...
});
}