spring 事务不生效的几种情况
情况(一):
1 /** 2 * @Description //lf 事务不生效 情况 (一) 3 **/ 4 @Override 5 public boolean ta(Config config) { 6 //lf 当没有 @Transactional 注解的方法(ta)调用添加 @Transactional 注解的方法(tb) 7 // 这时调用完成后 ta 抛出异常, 8 // @Transactional原理是基于spring aop,aop又是动态代理模式的实现 内部调用,没有走代理, 9 // 用的是this 10 11 tb(config); 12 int a=1/0; 13 return true; 14 } 15 @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED) 16 public Boolean tb(Config config){ 17 save(config); 18 return true; 19 }
情况(二):
1 @Transactional(propagation = Propagation.REQUIRED) 2 public Boolean tb(Config config){ 3 // lf 非RuntimeException 错误,都不会回滚。 4 // 所以这情况需要在 注解里添加rollback = Exception.css, 所有异常都进行回滚 5 save(config); 6 return true; 7 }
情况(三):
这三种情况都不会生效,当然现在idea很只能了,添加这些是不能和@Transactional 注解同时存在的
所有还有事务注解的方法 一定是public 标识,
- private 方法无法添加事务管理.
- final 方法无法添加事务管理.
- static 方法无法添加事务管理.
情况(四):
1 /** 2 * @Description //lf 事务不生效 情况(四) 3 */ 4 @Transactional(propagation = Propagation.REQUIRED) 5 public boolean ta1(Config config) { 6 // lf 添加了try{}catch 也不会进行回滚 需要把异常抛出或 设置事务回滚 7 try { 8 tb1(config); 9 int a=1/0; 10 } catch (Exception e) { 11 // lf 设置事务回滚 12 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 13 } 14 return true; 15 }
转载:https://blog.csdn.net/qq_38380025/article/details/105859817