zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    虚拟机网络不通
    设计师升职加薪必须知道的10个设计网站
    Centos设置防火墙与开放访问端口
    设置Jexus开机启动
    .Net 操作Excel表格
    Core 2.0使用Nlog记录日志+Mysql
    C# 操作docx文档
    JS截取页面,并保存到本地
    XmlReader 使用
    requireJS简单应用
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10260066.html
Copyright © 2011-2022 走看看