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


    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.

  • 相关阅读:
    2-Fourteenth Scrum Meeting-20151214
    2-Thirteenth Scrum Meeting-10151213
    2-Twelfth Scrum Meeting20151212
    2-Eleventh Scrum Meeting20151211
    L465 Climate Change May Take Away Your Ability to Flush the Toilet
    L458 Interview
    L457 早上锻炼减肥
    L456 学英语 看美剧
    L455 人之初,性本衰
    L454 正确喝水
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10260066.html
Copyright © 2020-2023  润新知