情况一:
throw 为了模拟出现异常
这种情况下 事务是不生效的
情况二:
在情况一的代码基础上 加上回滚 事务生效
情况三:
出现 运行时异常 即 RuntimeException 时 事务依然有效
情况四:
代码我们使用 try catch 包裹的时候 如果出现异常会跳到catch方法里 第二个删除方法被跳过 事务不生效
情况六(后补充):对情况四进行补充
@Override @Transactional(rollbackFor = Exception.class) public void ceshi() { try { LoginRecord loginRecord = new LoginRecord(); loginRecordMapper.insert(loginRecord); if (true){ throw new BaseServiceException("错误异常"); } BookFile bookFile = new BookFile(); bookFileMapper.insert(bookFile); }catch (Exception e){ //方式一:手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //方式二: catch中再抛出异常 throw new BaseServiceException("shiwu"); } }
以下两种方式可以实现 catch下事务回滚
//方式一:手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //方式二: catch中再抛出异常 throw new BaseServiceException("shiwu");
情况五:
testTransaction() 方法 有事务
test() 方法 没有事务
test()方法 调用 testTransaction() 方法 事务不生效
因为spring的事务是通过生成代理类实现的 内部方法互相调用不会生成代理类
解决办法 在最外层方法上面添加事务