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. 小白的java学习之路 “ 选择结构(一)”

    if选择结构: if选择结构是根据条件判断之后再做处理的一种语法结构. 1.if选择结构的语法: public class Demo{ public static void main(String[] ...

  2. Django中非视图函数获取用户对象

    今天遇到了一个问题:在Django中怎么从非视图函数中获取用户对象?怎么保证不同的请求获取到不同的用户对象? 平常我们获取用户对象使用的是: request.user 不得不说,这确实很方便. 但是, ...

  3. 洛谷【P2022 有趣的数】 题解

    题目链接 https://www.luogu.org/problem/P2022 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10 ...

  4. LeetCode 572. 另一个树的子树

    题目链接:https://leetcode-cn.com/problems/subtree-of-another-tree/ 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和 ...

  5. Linux下文件的七种类型

    文件属性 1. 本章引言 上一章通过学习文件io,知道了如何使用文件io来打开文件,对文件进行读写等操作,那么我们这一章将换一个角度,专门围绕文件属性进行相关的讨论. 1.1 什么是文件属性? 我们通 ...

  6. .NetCore3.0短网址项目

    Wei.TinyUrl 基于.NetCore3.0 + Mysql开发的短网址项目 项目地址:https://github.com/a34546/Wei.TinyUrl 演示效果: 快速开始 1. 修 ...

  7. 批量获取mysql数据库实例指定参数的值

    需求:需要对比所有mysql数据库实例上面的指定参数配置情况,同时需要需要能看到如ip,端口,master or slave,毕竟主和从参数不一样还是有可能的. 说明:必须要有个数据库存储所有是数据库 ...

  8. Bootstrap资料

    Bootstrap手册  : https://www.jqhtml.com/bootstraps-syntaxhigh/index.html 中文文档 :https://v3.bootcss.com/ ...

  9. APP和web设计区别

    1.web在给定了核心功能后,还可以往页面再添加小需求如banner.快捷工具条.分页等. APP界面设计时,则偏向精简,尽可能明显的展示核心功能. 2.APP中需要考虑ISO和Andriod两种交互 ...

  10. Zabbix使用手册

    https://blog.csdn.net/qq_40025218/article/details/81778754