Spring事务之传播机制
Spring事务传播机制:
Spring在TransactionDefinition接口中规定了种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播。
即协调已经有事务标识的方法之间的发生调用时的事务上下文的规则(是否要有独立的事务隔离级别和锁)。
事务的嵌套概念:
所谓事务的嵌套就是两个事务方法之间相互调用。Spring事务开启,或者是基于接口的,或者是基于类的代理被创建(注意一定要是代理,
不能手动new一个对象,并且此类(有无接口都行)一定要被代理————Spring中的bean只要纳入了IOC管理都是要被代理的)。
所以在同一个类中一个方法调用另一个有事务的方法,事务是不会起作用的。
概述:
当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务环境中,
Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个完整的业务操作,因为就会产生服务接口方法
嵌套调用的情况,Spring通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。
事务传播是Spring进行事务管理的重要概念。在下文中将详细分析不同事务传播行为的表现形式,掌握他们之间的区别。
一、事务传播行为种类
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播:
如下为 org.springframework.transaction.TransactionDefinition接口。
package org.springframework.transaction; public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
int TIMEOUT_DEFAULT = -1; int getPropagationBehavior();//事务的传播行为 int getIsolationLevel();//事务的隔离级别 int getTimeout();//事务的过期时间 boolean isReadOnly();//事务的读写特性 String getName();//获取名称
}
01. required:是Spring默认的事务传播行为。指定的方法必须在事务内执行,如果没有事务,自动创建事务并执行。
02. support:有没有事务都执行,有事务就在事务中执行,否则直接执行。
03. mandatory:如果当前存在事务,就执行该事务,如果当前不存在事务,就抛出异常。
04. requires_new:总是创建新事务,如果当前方法存在事务,则将当前方法事务先挂起(先执行新创建的事务,再执行被挂起的当前方法本身的事务),直到新创建的事务执行完毕。
05. not_supported:不能再事务中执行,如果当前方法存在事务,则将当前方法事务挂起。
06. never :不能在事务中执行,如果当前方法存在事务,则会抛出异常。
07. nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与require类似的操作。
注意:
requires_new 是启动一个新的,不依赖于环境的“内部”事务。
这个事务将被完全commited或者rollback而不依赖于外部事物,它拥有自己的隔离范围,自己的锁等等。当内部事务开始执行时,外务事务将会被挂起,内部事务结束时,外部事物将继续执行。
另一方面,nested是开始一个“嵌套的”事务,它是已经存在的事务的一个真正的子事务。嵌套事务开始执行时,它将取得一个savepoint。如果这个事务执行失败,我们将回滚到次savepoint,嵌套事务是外部事务的一部分,只有外部事务结束后嵌套事务才会被提交。(嵌套事务不能够提交,它必须通过外层事务来完成提交的动作,外层事务的回滚也会造成内部事务的回滚)
由此可见,requires_new 和 nested 最大的区别在于:
requires_new 完全是一个新的事务,而nested则是外部事务的子事务,如果外部事务commit,嵌套事务也会被commit,这个规则同样适用于rollback。
借助例子理解,请查看 https://www.cnblogs.com/softidea/p/5962612.html
Spring事务之传播机制的更多相关文章
- 数据库的特性与隔离级别和spring事务的传播机制和隔离级别
首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离 ...
- spring事务的传播机制新解
以下是事物的传播机制: @Transactional(propagation=Propagation.REQUIRED)如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)@Transacti ...
- Spring事务的传播行为 @Transactional(转)
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
- Spring事务的传播行为 @Transactional
Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...
- 关于事务,事务的特性,spring事务的传播特性
1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...
- Spring事务的传播特性和隔离级别
事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...
- Spring事务的传播行为
本文主要介绍下Spring事务中的传播行为. 事务传播行为介绍 Spring中的7个事务传播行为: |事务行为|说明 | |:--|:--| |PROPAGATION_REQUIRED | 支持当 ...
- Spring事务的传播:PROPAGATION_REQUIRED
PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. ServiceA { void methodA() { ServiceB.method ...
- Spring事务的传播行为分析
前言 最近项目有涉及到Spring事务,所以工作之余,想认真了解学习下Spring事务,查阅了若干资料,做了一个demo(PS:参考了大牛的). 现分享总结如下: 1.Spring 事务的简介 理解事 ...
随机推荐
- STL-deque 双端数组简析
#include <iostream> #include <deque> using namespace std; int main() { // 插入 deque<in ...
- Java-算式填符号
题目: 某批警察叔叔正在进行智力训练:1 2 3 4 5 6 7 8 9 = 110 请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号).之间没有填入符号的数 ...
- 洛谷【P5004 专心OI - 跳房子】 题解
题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...
- 解决NahimicSvc32.exe与bilibili直播姬的音频不兼容的问题
某次测试哔哩哔哩直播姬的时候发现系统声音采集异常的错误 NahimicSvc32.exe是NahimicService下的程序,奇怪的是我的本本所有硬件没有一个微星有关系,怎么就装上了微星的服务程序? ...
- 洛谷 P4708 画画
题意 在所以置换下,本质不同的各个极大连通子图均含有欧拉闭迹的\(n\)阶图个数 做法 务必先做完这题再看此题解,因为会省略大部分分析了 仍是从边入手,隔外限制:各个点度数是偶数 某个因子内\((m= ...
- LaTeX技巧001:LaTeX中输入大小写罗马数字
\uppercase\expandafter{\romannumeral20} \romannumeral20 前者将输入大写罗马数字20, 后者将输入小写罗马数字20.
- navicat连接mysql出现2059错误的解决方法
安装navicat之后新建连接出现了2059的错误 网上查询过后,发现这个错误出现的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则 ...
- NOI Online能力测试游记:退役选手的自娱自乐
2020年2月17日早上8点,CCF发布了关于举办NOI Online能力测试的通知. 为给选手提供一个锻炼的机会,CCF拟举办一场NOI Online能力测试.测试分为入门组和提高组,每组限额报名3 ...
- 1级搭建类107-Oracle 18c 单实例 FS(华为云)公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...
- Win10下安装tensorflow详细过程
首先声明几点: 安装tensorflow是基于Python的,并且需要从Anaconda仓库中下载. 所以我们的步骤是:先下载Anaconda,再在Anaconda中安装一个Python,(你的电脑里 ...