Required、Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html

Mandatory、Never、Not_Support传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10260030.html

我的Spring事务传播属性介绍比较传送门:https://files.cnblogs.com/files/lvbinbin2yujie/Spring_Tx_Note.rar

Spring事务传播属性Nested

说明:如果有事务运行,就作为这个事务的嵌套事务运行; 如果没有事务运行,新建一个事务运行;

首先要说的,Nested类型事务测试时候使用DataSourceTransactionManager作为事务管理器,DataSourceTransactionManager只对jdbcTemplate、ibatis有效;且需要支持JDBC3.0才起作用

ServiceA.java文件

ServiceB.java文件

ServiceA中的testNest方法本身是个事务;testNest操作了jdbcTemplate写入一条数据,另外ServiceB的三个NESTED方法分别写入一条记录,不过最后一个方法手动模拟抛出了异常;

测试Main方法:

执行之后查看数据库结果: serviceBNest3方法一定写入过青雉,但是回滚了记录;最终testNest方法也成功提交了; 注意的是, 三个Nested方法一定要try-catch,不然testNest的记录都会回滚,Nested方法也没意义了;   try-catch包围住NESTED方法,是为了保证NESTED方法执行失败不干扰到该方法以外执行的操作的正常提交回滚 ; 每一个NESTED方法开始可以看做是一个SavePoint点,执行失败,就会回滚到该方法开始的地方;

修改下ServiceA.java文件

执行测试方法:  发现数据库一条记录都不存在

原因分析: 外层事务回滚,内层嵌套事务会全部回滚;

NESTED和REQUIRED_NEW的区别:

  1. 假设都是在一个REQUIRED类型的事务里调用这些事务,就像上面的例子,该REQUIRED类型方法调用抛出异常,REQUIRED_NEW的方法仍然可以提交,但是NESTED还要受到REQUIRED事务回滚而被迫回滚; 这就是我认为的新的事务与内嵌事务的区别;
  2. 假设都是在一个REQUIRED类型的事务里调用这些事务方法,REQUIRED_NEW和NESTED都抛出异常的情况下,外层事务不写try-catch,都会导致该REQUIRED类型事务全部回滚.  REQUIRED_NEW和NESTED调用处写了try-catch块,外层可以正常提交 ; 但是REQUIRED类型的外层即使写了Try-catch块,也会抛出异常: Transaction rolled back because it has been marked as rollback-only

查看源码的时候,又意识到一个问题:

  ServiceA.java文件

 ServiceB.java文件

 

说明: 当全局事务ReadOly为true的时候,ServiceB的方法为NESTED类型,即使ServiceB不执行数据库增删改操作,同样会抛出异常;

Connection is read-only. Queries leading to data modification are not allowed.

原因分析:因为NESTED事务是采用JDBC3.0的SavePoint进行回滚事务,只读的Connection创建回滚点就会抛出该异常;关于该异常具体信息我也不甚了解。同样的,只读事务即使不使用NESTED事务,如果进行增删改操作,也会抛出异常

Connection is read-only. Queries leading to data modification are not allowed.

最新文章

  1. CM+CDH安装遇到的问题
  2. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
  3. Vijos1056 图形面积
  4. 图像质量评价指标之Matlab实现
  5. 字符串流sstream[part2/使用同一个字符串流反复读写数据]
  6. Apache Spark BlinkDB
  7. Linux 内核简介
  8. C++函数调用的反汇编过程及Thunk应用
  9. 2017CCPC秦皇岛G ZOJ 3987Numbers(大数+贪心)
  10. try{}catch(e){}不能捕获到异常
  11. PXE高效能批量网络装机
  12. ASP.NET获取服务器信息大全
  13. 杂谈---这些大忌,你在面试的时候发生过吗?(NO.1)
  14. VC/MFC程序开启关闭和打开自己或其他软件,更改窗口类
  15. python-day21--序列化模块模块
  16. java_web连接SQL_server详细步骤
  17. java 多线程11:volatile关键字
  18. 工作流JBPM_day02:3-预定义的活动1_4-预定义的活动2+在图片上高亮显示正在执行的上活动
  19. 手把手教你创建私有podspec
  20. cannot be cast to javax.servletFilter

热门文章

  1. linux创建、进入、修改目录或者文件权限 ‘ACM’时间是什么?怎么修改?
  2. centos救援模式实验笔记
  3. FastReport
  4. play framework - 初识
  5. Windows核心编程:第5章 作业
  6. 新品成熟EMR源码电子病历系统软件NET网络版CS可用带数据库全文档
  7. 动态产生select option列表
  8. 背水一战 Windows 10 (52) - 控件(集合类): ItemsControl - 自定义 ItemsControl, 自定义 ContentPresenter
  9. [leetcode.com]算法题目 - Symmetric Tree
  10. [JSOI2018]列队(主席树)