@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事务提交后触发异步方法的主要内容,如果未能解决你的问题,请参考以下文章

第八章 事务型消息

@Async异步不影响事务提交@Transaction

@Async 和 @Transactional:不工作

Spring @Transactional 浅谈

暂停交易是不是超时?

Spring 为在 @Transactional 注释方法中调用的每个 JpaRepository 方法打开一个新事务