一.什么是事务传播性

大白话讲就是,方法之间互相调用的时候,事务如何传播,比如A()调用B(),B()的事务是和A()共用一个事务(失败一起提交)?

还是新事务(两者事务互不影响)?,还是说B()不需要事务?,这就是事务传播性的意思。

    @Transactional()
public void methodA(){
methodB();
//doSomething
} @Transactional()
public void methodB(){
//doSomething
}

代码中的methodB()默认的传播性是REQUIRED,表示和methodA共用一个事务,要提交一起提交,要失败一起回滚。

二.spring中几种事务传播性

事务传播性 说明
REQUIRED 默认传播性,如果当前有事务,就沿用当前事务,如果没有就新建一个事务
SUPPORTS 支持当前事务,如果当前没有事务,就以非事务运行
REQUIRES_NEW 新建一个事务,如果当前存在事务,就把当前事务挂起
NOT_SUPPORTED 不支持事务,如果当前存在事务,就把当前事务挂起。
MANDATORY 强制使用当前事务,如果当前没有事务就抛异常
NEVER 以非事务方式运行,如果当前存在事务,则抛出异常
NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

三.举例说明

1.REQUIRED

说明:支持当前事务,如果当前没有事务就新建一个事务

insertUser()和insertStu是共用一个事务,要提交一起提交要失败一起失败。

@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(String name) {
User user = new User();
user.setName(name);
userDao.insertUser(user);
stuService.insertStu(name);
}
stuService中
@Transactional(propagation = Propagation.REQUIRED)
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
stuDao.insertUser(stu);
//这个地方发生异常,会引起insertStu也回滚,说明两者的事务是同一个
throw new RuntimeException();
}

2.REQUIRES_NEW

说明:开启新的事务,如果当前存在事务,就挂起当前事务。

insertUser()的失败回滚,不会导致insertStu的回滚,因为insertStu()在一个新的事务中。

@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(String name) {
User user = new User();
user.setName(name);
userDao.insertUser(user);
stuService.insertStu(name);
throw new RuntimeException();
}
//上面的方法抛异常事务的回滚,不会导致下面事务回滚,stu插入成功,user插入失败
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
stuDao.insertUser(stu); }

3.SUPPORTS

说明:如果当前已经存在事务,那么加入该事务,否则创建一个所谓的空事务(可以认为无事务执行)

insertUser是以非事务运行的,所以insertStu也是没有事务的,所以两个保存都会成功

但是如果给inertStu加上@Transactional(propagation = Propagation.REQUIRED)insertStu是有事务的。

    public void insertUser(String name) {
User user = new User();
user.setName(name);
userDao.insertUser(user);
stuService.insertStu(name);
throw new RuntimeException();
} @Transactional(propagation = Propagation.SUPPORTS)
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
stuDao.insertUser(stu);
}

4.NOT_SUPPORTED

说明:不支持事务,如果当前存在事务,挂起当前事务,然后新的方法在没有事务的环境中执行

下面的insertUser会回滚,insertStu将以非事务运行,所以不会回滚

这种的业务场景可能是,日志写入事务要和主事务隔离,外层事务写入失败,不影响日志的写入。

@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(String name) {
User user = new User();
user.setName(name);
userDao.insertUser(user);
stuService.insertStu(name);
throw new RuntimeException();
} @Transactional(propagation = Propagation.NOT_SUPPORTED)
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
stuDao.insertUser(stu);
}

5.MANDATORY

说明:当前必须存在一个事务,否则抛出异常。

因为insertUser()没有配置事务,所以insertStu()会报错。

异常信息:No existing transaction found for transaction marked with propagation 'mandatory'

public void insertUser(String name) {
User user = new User();
user.setName(name);
userDao.insertUser(user);
stuService.insertStu(name);
throw new RuntimeException();
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
stuDao.insertUser(stu);
}

6.NEVER

说明:不支持事务,如果当前存在事务,就抛出异常。

因为insertUser()配置了事务,所以在insertStu中会报错。

异常信息:Existing transaction found for transaction marked with propagation 'never'

@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(String name) {
User user = new User();
user.setName(name);
userDao.insertUser(user);
stuService.insertStu(name);
//throw new RuntimeException();
} @Transactional(propagation = Propagation.NEVER)
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
stuDao.insertUser(stu);
}

7.NESTED

说明:NESTED修饰的内部方法属于外部事务的子事务,外围主事务回滚,子事务一定回滚,而内部子事务可以单独回滚而不影响外围主事务和其他子事务

主要的场景可能是,下单的时候,送积分,如果下单失败,送积分也要回滚,但送积分失败不影响下单失败。这种场景可以使用这种传播性

spring 事务传播性的更多相关文章

  1. Spring事务传播性

    事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题.事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定 ...

  2. spring事务传播性与隔离级别

    事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...

  3. 事务传播性、隔离性与MVCC

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

  4. 理解 spring 事务传播行为与数据隔离级别

    事务,是为了保障逻辑处理的原子性.一致性.隔离性.永久性. 通过事务控制,可以避免因为逻辑处理失败而导致产生脏数据等等一系列的问题. 事务有两个重要特性: 事务的传播行为 数据隔离级别 1.事务传播行 ...

  5. Spring的事务传播性与隔离级别以及实现事物回滚

    一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...

  6. Spring的事务传播性

    事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题.事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定 ...

  7. 关于spring 事物传播性的研究

    spring的一大特色就是数据库事务管理方便,我们在代码中编写代码时,看不到事务的使用,关键是spring 使用了AOP进行事务拦截.   这篇文章主要介绍spring的事务传播性.   1.为什么要 ...

  8. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  9. 事务、事务特性、事务隔离级别、spring事务传播特性

    事务.事务特性.事务隔离级别.spring事务传播特性   1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功, ...

随机推荐

  1. CF1041B Buying a TV Set 题解

    Content 给定四个数 \(a,b,c,d\),求满足以下条件的数对 \((x,y)\) 的个数: \(x\leqslant a,y\leqslant b\). \(\dfrac{x}{y}=\d ...

  2. mvn 把本地jar包打包到本地仓库中

    命令如下: mvn install:install-file -Dfile=apache-ant-zip-2.3.jar -DgroupId=com.ckfinder -DartifactId=apa ...

  3. axiso 高级封装

    ​ import axios from 'axios'; import qs from 'qs'; const Unit = { async getApi(ajaxCfg){ let data = a ...

  4. Linux c++编译总结(持续更新)

    1. 没有定义的符号 这类的错误, 解决办法:A. 添加对应的头文件(源文件), B.前置声明 1.1 错误描述: error: variable has incomplete type 'class ...

  5. 【九度OJ】题目1065:输出梯形 解题报告

    [九度OJ]题目1065:输出梯形 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1065 题目描述: 每组测试 ...

  6. 【LeetCode】576. Out of Boundary Paths 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 状态搜索 记忆化搜索 相似题目 参考资料 ...

  7. 【LeetCode】653. Two Sum IV - Input is a BST 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:BFS 方法二:DFS 日期 题目地址:ht ...

  8. Network (poj1144)

    A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting se ...

  9. 1067 - Combinations

    1067 - Combinations   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Giv ...

  10. 论文翻译:2019_Deep Neural Network Based Regression Approach for A coustic Echo Cancellation

    论文地址:https://dl.acm.org/doi/abs/10.1145/3330393.3330399 基于深度神经网络的回声消除回归方法 摘要 声学回声消除器(AEC)的目的是消除近端传声器 ...