Bootstrap

Spring事务失效的几种场景及原因

1. 抛出检查异常导致事务不能正确回滚

  • 原因:Spring默认只会回滚非检查异常。
  • 解决:配置rollbackFor属性。
@Transactional(rollbackFor = Exception.class)

 2. 业务方法内自己try-catch异常导致事务不能正确回滚

  • 原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。
  • 解决1:异常原样抛出
    @Transactional(rollbackFor = Exception.class)
    public void test2()throws Exception{
        try{

        }catch (Exception e){
            e.printStackTrace();
        }
    }

或者

    @Transactional(rollbackFor = Exception.class)
    public void test2(){
        try{

        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

  • 解决2:手动设置TransactionStatus.setRollbackOnly()
;