zoukankan      html  css  js  c++  java
  • Spring事务传播属性介绍(二).mandatory、not_supported、never、supports

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

    Nested传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10260066.html

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

    事务传播属性三. PROPAGATION_MANDATORY

             说明:  当前方法必须要在有事务方法中运行,不然就抛出异常;如果有事务,就加入当前事务。

           

    查看运行结果验证:抛出异常

    Exception in thread "main" org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

     

    分析结果:serviceMADATORY方法没有被事务增强,调用serviceB的testService方法时,发现没有事务,但是MANDATORY属性强制要求有事务就会抛出异常;

    所以在ServiceA的serviceMANDATORY方法上加上Transactional有事务的注解

     

    查看输出结果: 可以看到没有报错,并且加入了当前全局事务;这种情况就和REQUIRED用法几乎相同.

     

    事务传播属性四:PROPAGATION_NOT_SUPPORTED

    说明: 当前方法不应该有事务,如果有事务存在,将它挂起,以无事务状态运行  (无事务,就是指底层的Connection对象的autoCommit、isolation等属性与数据库有关,与dataSource设置的属性有关,不会被Spring改变,下面会做个试验测试下.)

    修改下ServiceA和ServiceB的测试代码:

         

    查看输出日志: NOT_SUPPORTED可以看到将当前事务挂起,在无事务状态运行,并且在ServiceB方法中做的数据库操作不会随着全局事务回退而回退;

     

             实验一:  修改下ServiceA和ServiceB

    ServiceA修改后:

     

    ServiceB修改后:

     

    结合输出日志:  可以验证NOT_SUPPORTED确实没有事务运行

             补充:DataSourceUtils的getConnection方法是事务同步的,如果你在ServiceB的方法中执行这样的方式获取连接,那ServiceB也会将这个Connection存入TransactionSynchronizationManager的resource线程局部变量上;

    事务传播属性五. PROPAGATION_NEVER

             说明: 当前方法不应该运行在事物中,如果有事务就抛出异常;

    ServiceA.java

     

    ServiceB.java  (验证是否有事务)

     

    测试类方法:

       

    查看日志输出:  同样获取了transaction,只不过这种情况下transaction对象都是null,也是没有事务的意思.

     

    PROPAGATION_NEVER和PROPAGATION_NOT_SUPPORTED区别:

             当进入PROPAGATION_NEVER事务的方法时,发现没有事务就正常运行,发现有事务存在,立刻抛出异常,该方法根本不会执行; 而PROPAGATION_NOT_SUPPORT只是将事务挂起,继续执行该方法;

     NEVER发现事务存在时候抛出的异常情况类似如下:

    Exception in thread "main" org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never'

     

    事务传播属性六:PROPAGATION_SUPPORTS

             说明:  支持事务,你有事务,ok我加入你的全局事务,成为local transaction;你没有事务,那我还是可以一样运行; 这个就不举例子了.

    事务传播属性七:PROPAGATION_NESTED

             说明: 如果当前有事务在运行,就作为这个事务的内嵌事务运行;当前没有事务,就新建一个事物运行;

      附:NESTED事务见下一篇详细分析;

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10260030.html
Copyright © 2011-2022 走看看