码迷,mamicode.com
首页 > 编程语言 > 详细

Spring事务传播属性介绍(三).Nested

时间:2019-01-12 17:59:44      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:tps   内嵌   导致   地方   作用   ado   color   数据库   and   

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.

技术分享图片

 

Spring事务传播属性介绍(三).Nested

标签:tps   内嵌   导致   地方   作用   ado   color   数据库   and   

原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10260066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!