JAVA事务回滚的使用方法

假设这是一个service类的片段

try{ 
    //出现异常
} catch (Exception e) {
            e.printStackTrace();
           //设置手动回滚
            TransactionAspectSupport.currentTransactionStatus()
                    .setRollbackOnly();
        }
//此时return语句能够执行
return  xxx;

当我们需要在事务控制的service层类中使用try catch 去捕获异常后,就会使事务控制失效,因为该类的异常并没有抛出,就不是触发事务管理机制。怎样才能即使用try catch去捕获异常,而又让出现异常后spring回滚呢,这里就要用到

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

完美解决问题。并且能够使该方法执行完。

@Transactional(rollbackFor = Exception.class)
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

在方法中,使用 throw new Exception  或 try{}catch(){}  抛出或捕获异常的,不会形成是事务回滚。可以在事务回滚的时候加上 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 可以回滚事物

如下所示

JAVA事务回滚的使用方法_第1张图片

实现功能:需要捕获到@Transactional中的异常,同时不影响事物回滚

1、正常情况下加注解@Transactional和try catch捕获异常会让注解失效

2、解决办法如下代码

 @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean addAlarm(AlarmMeta alarmMeta){
       addtest();
       update();
       update2();
            return true;

        }catch (Exception e){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//关键
            return false;
        }

    }
3、spring boot入口函数添加@EnableTransactionManagement注解

 

 实现事务回滚需要注意的问题:
1.@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。
2.@Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
3.默认情况下,spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。
如果事务在try{}catch(Exception e){e.printStackTrace();}中跑,并且catch中只是打印e的话,那么事务不会rollback。因为异常被catch掉了,框架不知道发生了常。
如果想要rollback,
(1)注解上面写明异常类型即可,@Transactional(rollbackFor=Exception.class) 
(2)在方法上添加 throws Exception,将方法中出现的异常抛出给spring事务 
(3)去掉方法体中的try catch 
(4)catch (Exception e) { throw e;}继续向上抛,目的是让spring事务捕获这个异常
 除了以上注意的问题,说一下最近遇到的关于多数据源配置事务回滚的问题
在项目中关于事务该配置的也配置了,需要注意的问题也注意了,但有的事务可以出现回滚有的回滚失败,最终问题所在: id相同的事务配置分别配置在两个application.xml文件中,如果多个application.xml有配置,在web.xml中后加载的application.xml中的事务配置会覆盖最先加的application.xml中的事务配置。

你可能感兴趣的:(Java学习)