关于Spring嵌套事务异常问题

异常截图


异常信息: Transaction silently rolled back because it has been marked as rollback-only

代码展示

UserServiceImpl

@Transactional(rollbackFor = Exception.class)
public void test(){friendService.saveFriend(10000000000L, Arrays.asList(10000000000L));try {friendService.test();}catch (Exception e){e.printStackTrace();}System.out.println("123");}

FriendServiceImpl

@Transactional
public void test() {System.out.println(1/0);friendRepo.deleteByUid(10000000000L);
}

UserTest

@Autowired
private UserService userService;@Test
public void test(){userService.test();
}

产生原理

两个方法都加了事务注解,并且两个方法都会受到到事务管理的拦截器增强,并且事务传播的方式都是默认的,也就是REQUIRED,当已经存在事务的时候就加入事务,没有就创建事务。这里A和B都受事务控制,并且是处于同一个事务的。

A调用B,A中抓了B的异常,当B发生异常的时候,B的操作应该回滚,但是A吃了异常,A方法中没有产生异常,所以A的操作又应该提交,二者是相互矛盾的。

spring的事务关联拦截器在抓到B的异常后就会标记rollback-only为true,当A执行完准备提交后,发现rollback-only为true,也会回滚,并抛出异常告诉调用者。

抑制异常方式

1.在catch中添加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

2.尽量不要再service中try-cache

扩展

spring的事务处理方式才用的是AOP模式,走的是代理。当内部方法嵌套调用则并不会走代理就不会产生事务嵌套异常。需要走代理则采用注入类方式调用。

关于Spring嵌套事务异常问题相关推荐

  1. Spring嵌套事务异常Transaction rolled back because it has been marked as rollback-only

    项目场景: 在循环里面使用try-catch去捕获异常的时候,并且try里面调的方法它也使用了事务注解 @transactional或者用了事务切面AOP去实现方法事务注入 问题描述 我这里的业务需求 ...

  2. java 事务嵌套_解惑 spring 嵌套事务

    解惑spring嵌套事务 在所有使用spring的应用中,声明式事务管理可能是使用率最高的功能了,但是,从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义,让我们来看一 ...

  3. spring全局异常抓取validation校验信息

    spring全局异常抓取validation校验信息 参考文章: (1)spring全局异常抓取validation校验信息 (2)https://www.cnblogs.com/jianxiaopo ...

  4. spring mvc异常统一处理(ControllerAdvice注解)

    spring mvc异常统一处理(ControllerAdvice注解) 参考文章: (1)spring mvc异常统一处理(ControllerAdvice注解) (2)https://www.cn ...

  5. spring boot 异常(exception)处理

    spring boot 异常(exception)处理 参考文章: (1)spring boot 异常(exception)处理 (2)https://www.cnblogs.com/jinbuqi/ ...

  6. Spring事务异常回滚,try catch 捕获异常不回滚

    Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...

  7. Spring事务异常回滚,捕获异常不抛出就不会回滚

    Spring事务异常回滚,捕获异常不抛出就不会回滚 参考文章: (1)Spring事务异常回滚,捕获异常不抛出就不会回滚 (2)https://www.cnblogs.com/chen-lhx/p/6 ...

  8. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获

    Spring boot异常统一处理方法:@ControllerAdvice注解的使用.全局异常捕获.自定义异常捕获 参考文章: (1)Spring boot异常统一处理方法:@ControllerAd ...

  9. org.mybatis.spring.MyBatisSystemException异常及处理

    org.mybatis.spring.MyBatisSystemException异常及处理 参考文章: (1)org.mybatis.spring.MyBatisSystemException异常及 ...

最新文章

  1. Xcode(7.0以上版本)真机调试
  2. 基于有限元方法的薄板冲压成型过程的程序仿真
  3. Collection中list集合的应用常见的方法
  4. 论文浅尝 | 基于Universal Schema与Memory Network的知识+文本问答
  5. 哈佛大学教授:排名前5%学生的秘诀就3个字,这比勤奋更重要!
  6. SpringMVC报错The request sent by the client was syntactically incorrect ()
  7. cef3实现点击按钮弹出页面_Cef功能开发经验总结
  8. 五分钟学会文献管理神器—— Zotero
  9. DHCP的IP地址租约、释放
  10. 利用Excel处理OTU表
  11. 键盘录入(身高和体重)
  12. 生产用料清单-在制材料数量
  13. PRTG网络监控软件
  14. ncverilog脚本_Ncverilog 常用命令使用详解 | 学步园
  15. python处理Jenkins Job配置文件config.xml
  16. 3D语音天气球(源码分享)本文出自大苞米的博客(http://blog.csdn.net/a396901990)
  17. java 草稿_JAVA生成一张草稿
  18. WEBGL 2D游戏引擎研发系列 第三章 正交视口
  19. ️前端研发的新基础设施 - Rust ️
  20. 表格图片加载不出来,破图,加载失败

热门文章

  1. 小白学做网云小程序笔记(1)
  2. Java JUC高并发编程(一)
  3. 建设区块链基础设施,加速区块链等新技术与传统行业深度融合发展
  4. JSDoc 安装教程
  5. 恩智浦小白四轮组中线提取
  6. php 实现二叉树的最大深度_Java如何实现求二叉树的最大深度(附代码)
  7. 小程序源码:聊天斗图微信表情包-多玩法安装简单
  8. 【Python】斐波那契数列之兔子问题
  9. 点群不可约表示的通俗易懂讲解
  10. 判断半群、独异点、群