异步线程进行事务的管理,异步线程事务失效解决方案

  1. 场景:工作中使用到异步线程,在发生异常时对操作的数据进行回滚,使用 @Transactional(propagation = Propagation.REQUIRES_NEW)失效
  2. 解决方式:进行手动提交事务
  3. 代码:
//TODO :获取当前线程请求头信息(解决丢失请求头问题)
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

ThreadUtil.execAsync(new Runnable() {


    @Override
    public void run() {
        //每一个线程都来共享之前的请求数据
       //每一个线程都来共享之前的请求数据
RequestContextHolder.setRequestAttributes(requestAttributes);
String name = "";
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物的传播行为
TransactionStatus status = txManager.getTransaction(def); // 获得事务状
try{
//业务代码
/*
*************
*/
txManager.commit(status);//手动提交事务
}catch(Exception e){
txManager.rollback(status);//手动回滚事务
}





你可能感兴趣的:(开发总结异常,java)