@Transactional事务提交后触发异步方法
Posted root_zhb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Transactional事务提交后触发异步方法相关的知识,希望对你有一定的参考价值。
异步处理逻辑,在事务提交后再处理
场景
2个service方法, 方法A中调用方法B。
方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollbackFor = Exception.class)
方法B 比较耗时,为了不影响核心业务,方法B 用@Async注解,单独开启一个线程去异步执行。
出错原因
方法B是异步方法,导致方法A事务还没提交时(不一定出错,具体就看哪个线程执行的快了)方法B就执行了。
解决
//如果有事务,则事务提交之后在执行
if (TransactionSynchronizationManager.isActualTransactionActive())
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter()
@Override
public void afterCommit()
try
// todo 异步任务,如http请求,mq发送等
catch (Exception e)
e.printStackTrace();
);
//没有事务,直接执行
else
// todo 异步任务,如http请求,mq发送等
以上是关于@Transactional事务提交后触发异步方法的主要内容,如果未能解决你的问题,请参考以下文章