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事务之传播机制的更多相关文章

  1. 数据库的特性与隔离级别和spring事务的传播机制和隔离级别

    首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离 ...

  2. spring事务的传播机制新解

    以下是事物的传播机制: @Transactional(propagation=Propagation.REQUIRED)如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)@Transacti ...

  3. Spring事务的传播行为 @Transactional(转)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  4. Spring事务的传播行为 @Transactional

    Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...

  5. 关于事务,事务的特性,spring事务的传播特性

    1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...

  6. Spring事务的传播特性和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  7. Spring事务的传播行为

      本文主要介绍下Spring事务中的传播行为. 事务传播行为介绍 Spring中的7个事务传播行为: |事务行为|说明 | |:--|:--| |PROPAGATION_REQUIRED | 支持当 ...

  8. Spring事务的传播:PROPAGATION_REQUIRED

    PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. ServiceA { void methodA() { ServiceB.method ...

  9. Spring事务的传播行为分析

    前言 最近项目有涉及到Spring事务,所以工作之余,想认真了解学习下Spring事务,查阅了若干资料,做了一个demo(PS:参考了大牛的). 现分享总结如下: 1.Spring 事务的简介 理解事 ...

随机推荐

  1. 聊聊SNMP协议

    注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/snmp-protoco ...

  2. 在VS的依赖项中引用项目

    操作步骤:鼠标右击项目(注意是项目)->添加->引用->项目(在项目列表中选择需要引用的项目)->确定

  3. PIE-SDK For C++内存栅格数据的创建

    1.功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式.每一种数据有不同的数据格式,目前PIE SDK支持多种数据格式的数据创建,下面对内存栅格数据格式的数据创建功能进行介绍. 2.功能 ...

  4. python里的复数complex

    复数是一个数学概念,包含了实部和虚部.在python设计语言中,可以直接定义以j为单位,也可以使用complex函数创建复数,这个函数可以传实部和虚部,也可以只传实部. 我们把形如z=a+bj(a,b ...

  5. Android 基础知识 -- Linux环境搭建

    Android 开发工具下载网站:http://www.androiddevtools.cn/ 1 JDK 1.1 下载JDK,解压后放到/usr/lib/jvm/目录 sudo mv jdk1.7. ...

  6. The Number of Inversions

    For a given sequence A={a0,a1,...an−1}A={a0,a1,...an−1}, the number of pairs (i,j)(i,j) where ai> ...

  7. 前端:将网站打造成单页面应用SPA

    前端:将网站打造成单页面应用SPA   前言 不知你有没有发现,像Github.百度.微博等这些大站,已经不再使用普通的a标签做跳转了.他们大多使用Ajax请求替代了a标签的默认跳转,然后使用HTML ...

  8. [CQOI2007] 余数求和 - 整除分块

    \(\sum_{i=1}^n\;k\;mod\;i\) Solution \(\sum_{i=1}^n\;k\;mod\;i\\=\sum_{i=1}^n(k-i\lfloor{\frac{k}{i} ...

  9. linux - mysql - 卸载:使用rpm方式安装的mysql

    一.查看系统中是否以rpm包安装的mysql rpm -qa | grep -i mysql 结果: 备注:如果有内容则证明是使用rpm方式安装的mysql 二.卸载 使用rpm -e 命令将上个命令 ...

  10. 立即关机C++源码

    #include<windows.h> using namespace std; int main(){ system("shutdown /p"); return 0 ...