spring Transaction中有一个很重要的属性:Propagation。主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系。

我晓得有点儿抽象,这也是为什么我想要写这篇博客的原因。看了后面的例子,大家应该就明白了。

一、Propagation取值:

REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;

SUPPORTS:如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;

MANDATORY:必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;

REQUIRES_NEW:创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;

NOT_SUPPORTED:在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;

NEVER:在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException。

二、REQUIRED与REQUIRED_NEW

上面描述的6种propagation属性配置中,最难以理解,并且容易在transaction设计时出现问题的是REQUIRED和REQURED_NEW这两者的区别。当程序在某些情况下抛出异常时,如果对于这两者不够了解,就可能很难发现而且解决问题。

下面我们给出三个场景进行分析:

场景一:

ServiceA.Java:

public class ServiceA {
@Transactional
public void callB() {
serviceB.doSomething();
}
}

ServiceB.java

public class ServiceB {
@Transactional
public void doSomething() {
throw new RuntimeException("B throw exception");
}
}
这种情况下,我们只需要在调用ServiceA.callB时捕获ServiceB中抛出的运行时异常,则transaction就会正常的rollback。

场景二

在保持场景一中ServiceB不变,在ServiceA中调用ServiceB的doSomething时去捕获这个异常,如下:

public class ServiceA {
@Transactional
public void callB() {
try {
serviceB.doSomething();
} catch (RuntimeException e) {
System.err.println(e.getMessage());
}
}
}
这个时候,我们再调用ServiceA的callB。程序会抛出org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only这样一个异常信息。原因是什么呢?

因为在ServiceA和ServiceB中的@Transactional propagation都采用的默认值:REQUREID。根据我们前面讲过的REQUIRED特性,当ServiceA调用ServiceB的时候,他们是处于同一个transaction中。如下图所示:

当ServiceB中抛出了一个异常以后,ServiceB会把当前的transaction标记为需要rollback。但是ServiceA中捕获了这个异常,并进行了处理,认为当前transaction应该正常commit。此时就出现了前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException。

场景三

在保持场景二中ServiceA不变,修改ServiceB中方法的propagation配置为REQUIRES_NEW,如下:

public class ServiceB {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomething() {
throw new RuntimeException("B throw exception");
}
}
此时,程序可以正常的退出了,也没有抛出UnexpectedRollbackException。原因是因为当ServiceA调用ServiceB时,serviceB的doSomething是在一个新的transaction中执行的。如下图所示:

所以,当doSomething抛出异常以后,仅仅是把新创建的transaction rollback了,而不会影响到ServiceA的transaction。ServiceA就可以正常的进行commit。

当然这里把ServiceA和ServiceB放在两个独立的transaction是否成立,还需要再多多考虑你的业务需求。

转载于:https://www.cnblogs.com/bendantuohai/p/5603356.html

spring Transaction Propagation 事务传播相关推荐

  1. Spring七种事务传播行为

    事务传播行为 "事务传播行为"描述的是:当一个事务方法被另一个方法调用时,该事务方法如何进行? 是创建新事务?丢弃事务?还是加入到已存在的事务呢? 针对这些情况,Spring框架定 ...

  2. spring 七种事务传播行为

    spring事务传播行为详解 一.什么是事务传播行为? 二.Spring中七种事务传播行为 三.REQUIRED,REQUIRES_NEW,NESTED异同 四.三种Transactional不回滚问 ...

  3. spring注解@transactional事务传播

    文章目录 事务传播 传播类型 REQUIRED SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED 事务传播 在spring中使用事务 ...

  4. Propagation事务传播行为

    @Transactional(propagation = Propagation.NOT_SUPPORTED) Propagation属性用来枚举事务的传播行为.所谓事务传播行为就是多个事务方法相互调 ...

  5. Spring中的事务传播行为

    前言:在Spring中,我们可以通过声明式事务,实现对数据库操作的事务管理.其中,在声明式事务时,有一个事务的属性为propagation,即事务的传播行为.今天,就来讨论该属性的作用. 什么是事务的 ...

  6. spring事务(Transaction)的七种事务传播行为及五种隔离级别

    1. 首先,说说什么事务(Transaction) 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一. 如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事 ...

  7. spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战

    一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...

  8. spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...

    146.简介一下Spring支持的数据库事务传播属性和隔离级别 介绍Spring所支持的事务和传播属性之前,我们先了解一下SpringBean的作用域,与此题无关,仅做一下简单记录. 在Spring中 ...

  9. java spring 事务传播_spring事务传播机制实例讲解

    天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...

最新文章

  1. 80年代高考数学卷,共10套,有您做过的高考卷吗?
  2. mysql错误用法insert into where
  3. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
  4. python3连接oracle数据库真操蛋_为64位Windows7的Python3安装MySQLdb
  5. php列出mysql表格,php列出mysql表所有行和列的方法
  6. mysql中error22_docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法...
  7. administrator用户不见了
  8. 【USACO】回文平方数
  9. spring boot 支持多少人在线_通过 spring-boot-starter-hbase 集成 HBase
  10. mysql添加mcafee 审计插件
  11. 系统集成项目管理工程师14 总结
  12. mysql数据模型三要素_数据模型的作用及三要素是什么?
  13. ZZNU-正约数之和(DP)
  14. 网宿科技孙靖泽:CDN规模门槛为5T,整合潮年底就会出现
  15. mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
  16. 微信小程序云开发之云数据库查询及动态输入
  17. 个人使用的一些脚本命令
  18. 无法加载操作系统,原因是关键系统驱动驱动程序丢失或包含错误 kisboot.sys
  19. 编程求ax2+bx+c=0的解
  20. 诛仙-有声小说全集.zip

热门文章

  1. 干货整理 Unity3D资源汇总
  2. 图像处理与计算机视觉资源汇总——论文+代码+教材+视频等等
  3. 人工智能中对机器学非常简要的介绍
  4. 视音频技术零基础学习方法
  5. Unity3d HDR和Bloom效果(高动态范围图像和泛光)
  6. 基于用户投票的排名算法(一):Delicious和Hacker
  7. 关于html的a标签的target=__blank 的安全漏洞问题
  8. PHP/TP5 接口设计中异常处理
  9. 项目经理面试中可能遇到的问题
  10. 元素失去焦点(隐藏软键盘)