记一次@Transactional事务无法回滚的原因

        最近在做一个导入功能的时候为了保证导入数据的原子性,使用@Transactional添加事务控制,按理在运行出现异常的时候,数据会进行回滚,然而实际并没有,检查了一下,发现有两个没注意的问题。

1.抛出的异常是checked异常

       异常其实分为两种,unchecked异常和checked异常,unchecked异常就是继承自Error或者RuntimeException这些运行期的异常,checked异常就是继承自Exception的异常,@Transactional注解默认只会回滚unchecked异常,如果需要回滚checked异常,需要使用RollbackFor指定回滚的异常种类。

 

2.异常被try-catch捕获

      一般情况下,为了程序的异常不直接抛出,我们会习惯性地使用try-catch去捕获异常,但是这样的话哪怕抛出了异常,也不会回滚,因为被catch掉了,除非在catch的方法体再重新抛出,但一般不这么做,如果我们需要进行回滚,可以在catch方法体手动进行回滚,只需要加上下面的代码即可。

 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

 

你可能感兴趣的:(学习随笔,JAVA,spring)