spring Transaction Propagation 事务传播
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 事务传播相关推荐
- Spring七种事务传播行为
事务传播行为 "事务传播行为"描述的是:当一个事务方法被另一个方法调用时,该事务方法如何进行? 是创建新事务?丢弃事务?还是加入到已存在的事务呢? 针对这些情况,Spring框架定 ...
- spring 七种事务传播行为
spring事务传播行为详解 一.什么是事务传播行为? 二.Spring中七种事务传播行为 三.REQUIRED,REQUIRES_NEW,NESTED异同 四.三种Transactional不回滚问 ...
- spring注解@transactional事务传播
文章目录 事务传播 传播类型 REQUIRED SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED 事务传播 在spring中使用事务 ...
- Propagation事务传播行为
@Transactional(propagation = Propagation.NOT_SUPPORTED) Propagation属性用来枚举事务的传播行为.所谓事务传播行为就是多个事务方法相互调 ...
- Spring中的事务传播行为
前言:在Spring中,我们可以通过声明式事务,实现对数据库操作的事务管理.其中,在声明式事务时,有一个事务的属性为propagation,即事务的传播行为.今天,就来讨论该属性的作用. 什么是事务的 ...
- spring事务(Transaction)的七种事务传播行为及五种隔离级别
1. 首先,说说什么事务(Transaction) 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一. 如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事 ...
- spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战
一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...
- spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
146.简介一下Spring支持的数据库事务传播属性和隔离级别 介绍Spring所支持的事务和传播属性之前,我们先了解一下SpringBean的作用域,与此题无关,仅做一下简单记录. 在Spring中 ...
- java spring 事务传播_spring事务传播机制实例讲解
天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...
最新文章
- 80年代高考数学卷,共10套,有您做过的高考卷吗?
- mysql错误用法insert into where
- [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
- python3连接oracle数据库真操蛋_为64位Windows7的Python3安装MySQLdb
- php列出mysql表格,php列出mysql表所有行和列的方法
- mysql中error22_docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法...
- administrator用户不见了
- 【USACO】回文平方数
- spring boot 支持多少人在线_通过 spring-boot-starter-hbase 集成 HBase
- mysql添加mcafee 审计插件
- 系统集成项目管理工程师14 总结
- mysql数据模型三要素_数据模型的作用及三要素是什么?
- ZZNU-正约数之和(DP)
- 网宿科技孙靖泽:CDN规模门槛为5T,整合潮年底就会出现
- mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
- 微信小程序云开发之云数据库查询及动态输入
- 个人使用的一些脚本命令
- 无法加载操作系统,原因是关键系统驱动驱动程序丢失或包含错误 kisboot.sys
- 编程求ax2+bx+c=0的解
- 诛仙-有声小说全集.zip