Spring的事务传播行为

Easter79
• 阅读 663
先举一个Spring的嵌套例子

ServiceA {
    void methodA() {
        ServiceB.methodB();
    }
}

ServiceB {
    void methodB();
}

事务传播属性可以在 @Transactional 注解的 propagation 属性中定义 比如:

        @Transactional(propagation=Propagation .```` ``` `` `PROPAGATION_REQUIRED` `` ``` ````)

七种事务传播行为:

  • ```` ``` `` `PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 ` `` ``` ````

  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

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

  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

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

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

详解

  1. ``**PROPAGATION_REQUIRED** `假如当前正要执行的事务不在另外一个事务里,那么就起一个新的事务 比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚 `![](http://static.oschina.net/uploads/img/201506/03205650_8dI7.jpg) ``

  2. **PROPAGATION_SUPPORTS** `如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行`

  3. **PROPAGATION_MANDATORY** `必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常`

  4. **PROPAGATION_REQUIRES_NEW** `这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。 `![](http://static.oschina.net/uploads/img/201506/03205650_02w2.jpg)

  5. **PROPAGATION_NOT_SUPPORTED** `当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。`

  6. **PROPAGATION_NEVER** `不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,那么ServiceB.methodB就要抛出异常了。`

  7. **PROPAGATION_NESTED** `理解Nested的关键是savepoint。他与 PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独 立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。 而Nested事务的好处是他有一个savepoint。`

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
spring事物管理之传播行为和隔离级别
大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。事物注解方式:@Transactional当标于类前时,表示类中所有方法都进行事物处理例子:@TransactionalpublicclassTestServiceBeanimplementsTest
Easter79 Easter79
3年前
spring事务传播性(PROPAGATION)
spring事务传播性PROPAGATION\_REQUIRED简介加入当前已有事务;只有当前没有事务才启一个新的事务设计类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED类ServiceB,方法method
Easter79 Easter79
3年前
Spring高级应用之注入嵌套Bean
在Spring中,如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。和普通的Bean一样,使用<bean元素来定义嵌套的Bean,嵌套Bean只对它的外部的Bean有效,Spring容器无法直接访问嵌套的Bean,因此定义嵌套Bean也无需指定id属性。如下配置片段是一个嵌套Bean的示例:<bean id
Easter79 Easter79
3年前
Spring事务回滚情况
spring默认非嵌套调用的情况Spring框架的事务基础架构代码将默认地只在抛出运行时和uncheckedexceptions时才标识事务回滚。也就是说,当抛出一个RuntimeException或其子类例的实例时。(Errors也一样默认地标识事务回滚。)从事务方法中抛出的Checkedexceptions将不
Stella981 Stella981
3年前
2019年JAVA面试题(高级资深)
记录下本年度最新的面试题:20190424//某互联网公司,劳工资源管理方向职位1.bio/nio/aio介绍下,粘包、拆包问题怎么解决?2.数据库四个特性是什么,事务传播性是怎么样的?spring事务和数据库事务的区别关系3.HashMap/concurrentHashMap区别和底层实现、TreeMap特点4.sql优化
可莉 可莉
3年前
2019年JAVA面试题(高级资深)
记录下本年度最新的面试题:20190424//某互联网公司,劳工资源管理方向职位1.bio/nio/aio介绍下,粘包、拆包问题怎么解决?2.数据库四个特性是什么,事务传播性是怎么样的?spring事务和数据库事务的区别关系3.HashMap/concurrentHashMap区别和底层实现、TreeMap特点4.sql优化
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的事务     事务管理在应用程序中起着至关重要的作用:它是一系列任务
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k