spring事务传播性(PROPAGATION)

Easter79
• 阅读 510

spring事务传播性


##PROPAGATION_REQUIRED ###简介

加入当前已有事务;只有当前没有事务才启一个新的事务

###设计

类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED
类ServiceB,方法methodB,事务级别定义为PROPAGATION_REQUIRED

###案例

先调用ServiceA.methodA,发现没有运行在事务中,分配一个新事务。再调用ServiceB.methodB(这个要写在ServiceA.methodA内部),发现已经运行在ServiceA.methodA的事务内部,就不再启新的事务,而使用ServiceA.methodA事务。

###总结

在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,2个方法内部的操作,都会被事务回滚。

##PROPAGATION_SUPPORTS ###简介

如果当前在事务中,即以事务的形式运行,如果当前不在一个事务中,那么就以非事务的形式运行

###设计

类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED
类ServiceB,方法methodB,事务级别定义为PROPAGATION_SUPPORTS

###案例1

先调用ServiceA.methodA,发现没有运行在事务中,分配一个新事务。再调用ServiceB.methodB(这个要写在ServiceA.methodA内部),发现已经运行在ServiceA.methodA的事务内部,继续使用事务运行。

###案例2

直接调用ServiceB.methodB,发现没有运行在事务中,使用非事务运行。

##PROPAGATION_MANDATORY ###简介

支持当前事务,如果当前没有事务,就抛出异常

###设计

类ServiceA,方法methodA,事务级别定义为PROPAGATION_NOT_SUPPORTED
类ServiceB,方法methodB,事务级别定义为PROPAGATION_MANDATORY

###案例

先调用ServiceA.methodA,发现没有运行在事务中,以非事务运行。再调用ServiceB.methodB(这个要写在ServiceA.methodA内部),发现已经运行在ServiceA.methodA的没有事务,抛出异常。

##PROPAGATION_REQUIRES_NEW ###简介

新建事务,如果当前存在事务,把当前事务挂起

###设计

类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED
类ServiceB,方法methodB,事务级别定义为PROPAGATION_REQUIRES_NEW

###案例

先调用ServiceA.methodA,发现没有运行在事务中,分配一个新事务。再调用ServiceB.methodB(这个要写在ServiceA.methodA内部),当执行到ServiceB.methodB的时候,ServiceA.methodA事务就会挂起,ServiceB.methodB启一个新的事务,等待ServiceB.methodB的事务完成以后,ServiceA.methodA的事务才继续执行。

###总结

ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,它抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可以提交。

##PROPAGATION_NOT_SUPPORTED ###简介

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

###设计

类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED
类ServiceB,方法methodB,事务级别定义为PROPAGATION_NOT_SUPPORTED

###案例

先调用ServiceA.methodA,发现没有运行在事务中,分配一个新事务。再调用ServiceB.methodB(这个要写在ServiceA.methodA内部),当执行到ServiceB.methodB的时候,ServiceA.methodA的事务挂起,ServiceB.methodB以非事务的状态运行完,再继续ServiceA.methodA的事务。

###总结

ServiceB.methodB数据操作出现异常不会回滚。

##PROPAGATION_NEVER ###简介

以非事务方式执行,如果当前存在事务,则抛出异常

###设计

类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED
类ServiceB,方法methodB,事务级别定义为PROPAGATION_NEVER

###案例

先调用ServiceA.methodA,发现没有运行在事务中,分配一个新事务。再调用ServiceB.methodB(这个要写在ServiceA.methodA内部),抛出异常。

##PROPAGATION_NESTED ###简介

理解Nested的关键是savepoint

###总结

Nested的事务和它的父事务是相依的,它的提交是要等和它的父事务一块提交的。也就是说,如果父事务最后回滚,它也要回滚的。而Nested事务的好处是它有一个savepoint。也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如ServiceC.methodC,继续执行,来尝试完成自己的事务。但是这个事务并没有在EJB标准中定义
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
spring事物管理之传播行为和隔离级别
大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。事物注解方式:@Transactional当标于类前时,表示类中所有方法都进行事物处理例子:@TransactionalpublicclassTestServiceBeanimplementsTest
Easter79 Easter79
3年前
Spring学习笔记十六
Spring事务ACID原子性一致性隔离性持久性编程式/声明式Spring事务管理抽象是PlatformTransactionManagerJDBC:DataSourceTransactionManagerJTA:JtaTransactionManagerHibernate:Hibern
Easter79 Easter79
3年前
Spring的事务传播行为
先举一个Spring的嵌套例子ServiceA {    void methodA() {        ServiceB.methodB();    }}ServiceB {    void methodB();}事务传播属性可以在@Trans
Easter79 Easter79
3年前
Spring事务回滚情况
spring默认非嵌套调用的情况Spring框架的事务基础架构代码将默认地只在抛出运行时和uncheckedexceptions时才标识事务回滚。也就是说,当抛出一个RuntimeException或其子类例的实例时。(Errors也一样默认地标识事务回滚。)从事务方法中抛出的Checkedexceptions将不
Wesley13 Wesley13
3年前
Spring声明式事务注解@Transactional
spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创
Easter79 Easter79
3年前
Spring事务的传播行为
\\\\\\\\\\\\\\\\\\\\sample\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ServiceA{      /\\      \事务属性配置为PROPAGATION\_REQUIRED    
Easter79 Easter79
3年前
Spring事务的传播行为案例分析
!(https://oscimg.oschina.net/oscnet/4dbf52544247d9434c2ef8456efb077a97e.png)网上关于Spring事务传播性以及隔离性的文章漫天盖地,还有不负责任的直接复制名词意思,文章虽然很多却是看的云里雾里,我们今天将分别给出案例和大家一起学习。1、给出Spring事务的4
Wesley13 Wesley13
3年前
Spring事务管理
Spring提供了一流的事务管理。在Spring中可以支持声明式事务和编程式事务。    本章主要目标如下:     1,Spring事务    2,事务属性    3,事务管理器    4,声明式事务      1.1Spring的事务     事务管理在应用程序中起着至关重要的作用:它是一系列任务
Wesley13 Wesley13
3年前
Mysql事务,并发问题,锁机制
1、什么是事务事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。原子性:要不全部成功,要不全部撤销隔离性:事务之间相互独立,互不干扰一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏持久性:事务的提交结果,将持久保存在数据库中2、事务并发会产生什么问题1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时
Stella981 Stella981
3年前
Spring 事务配置的五种方式
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。   总结如下: Spring事务类型详解:  PROPAGATION\_REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k