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.

  • 相关阅读:
    Spring Cloud Hystrix Dashboard的使用 5.1.3
    Spring Cloud Hystrix 服务容错保护 5.1
    Spring Cloud Ribbon 客户端负载均衡 4.3
    Spring Cloud 如何实现服务间的调用 4.2.3
    hadoop3.1集成yarn ha
    hadoop3.1 hdfs的api使用
    hadoop3.1 ha高可用部署
    hadoop3.1 分布式集群部署
    hadoop3.1伪分布式部署
    KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10260066.html
Copyright © 2011-2022 走看看