@TransactionalEventListener使用事务后执行回调
-
环境:springboot
-
MyTransactionListener - 事务监听器
@Slf4j
@Component
public class MyTransactionListener {
@Async("asyncServiceExecutor") // 用了自定义的线程池, 我们当然也可以不用多线程
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) // 见名知意: 事务提交后执行
public void commitedHandle(String say) {
log.info("AFTER_COMMIT => {}", say);
}
@Async("asyncServiceExecutor")
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) // 事务提交前执行
public void beforeCommitHandle(String say) {
log.info("BEFORE_COMMIT => {}", say);
}
@Async("asyncServiceExecutor")
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION) // 无论回滚、提交事务后都执行
public void afterCompletionHandle(String say) {
log.info("AFTER_COMPLETION => {}", say);
}
}
当然还可以自行测试其他方法,如:回滚… 上面的执行方法当然是 最终 => 事务前 => 事务后
- service - 伪代码
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Transactional
public void updViewById(Long id, String ip) { // 用我正在写的项目测试的, 源码就不贴了, 太烂了
applicationEventPublisher.publishEvent("浏览成功"); // 传递事件, 让监听器执行时打印"浏览成功"
articleMapper.update(article, articleQueryWrapper); // 更新article文章类
}
- test - 执行