当前位置:   article > 正文

java 事物 notsupport_Spring事务传播属性介绍(二).mandatory、not_supported、never、supports...

not_supported方法报错会中断外部方法吗

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

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

f29761d0a4b2ab97c64feaa27116298c.png     

e49e152f3957fd2a8b096f3a71402b19.png

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

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

8b6dabb71447e1b914584f39fef4f686.png

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

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

e4ed7f9084fd5a2b7e5245a9bc214a45.png

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

afb38c11de3326008d2d3bc4da13bc1e.png

事务传播属性四:PROPAGATION_NOT_SUPPORTED

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

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

d540307e5d16151b74495cad3f5dd4de.png    

3dc56858f3e82b3ce8a73eca45b11648.png

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

c5b812667db04ae8fea0c8fc2532c95f.png

实验一:  修改下ServiceA和ServiceB

ServiceA修改后:

b8eefe559c4674168a055110e081c366.png

ServiceB修改后:

a9236c6e051a57f6627c4089e166916a.png

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

1aadebf192306dd62f781fda863dc10f.png

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

事务传播属性五.PROPAGATION_NEVER

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

ServiceA.java

3a401d79bd02a1838a0bb852ecbff77d.png

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

e0acc27e7bc9e3a3a867fac1a4bbd368.png

测试类方法:

72466470698e58710389af6a8da7e307.png

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

52a99b11ec624b1d58c05c17c7d27be7.png

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'

093c90eb9913756ffc2393025ebba9b8.png

事务传播属性六:PROPAGATION_SUPPORTS

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

事务传播属性七:PROPAGATION_NESTED

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/405408
推荐阅读
相关标签
  

闽ICP备14008679号