spring 事务传播性
一.什么是事务传播性
大白话讲就是,方法之间互相调用的时候,事务如何传播,比如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 事务传播性的更多相关文章
- Spring事务传播性
事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题.事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定 ...
- spring事务传播性与隔离级别
事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...
- 事务传播性、隔离性与MVCC
一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...
- 理解 spring 事务传播行为与数据隔离级别
事务,是为了保障逻辑处理的原子性.一致性.隔离性.永久性. 通过事务控制,可以避免因为逻辑处理失败而导致产生脏数据等等一系列的问题. 事务有两个重要特性: 事务的传播行为 数据隔离级别 1.事务传播行 ...
- Spring的事务传播性与隔离级别以及实现事物回滚
一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...
- Spring的事务传播性
事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题.事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定 ...
- 关于spring 事物传播性的研究
spring的一大特色就是数据库事务管理方便,我们在代码中编写代码时,看不到事务的使用,关键是spring 使用了AOP进行事务拦截. 这篇文章主要介绍spring的事务传播性. 1.为什么要 ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- 事务、事务特性、事务隔离级别、spring事务传播特性
事务.事务特性.事务隔离级别.spring事务传播特性 1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功, ...
随机推荐
- CF177A1/A2 Good Matrix Elements 题解
Content 给定一个 \(n\times n\) 的矩阵,每个元素都有一个值,求出处于两条对角线以及中间行和中间列的元素之和. 数据范围:\(1\leqslant n\leqslant 5(\te ...
- java 图形化小工具Abstract Window Toolit
老掉牙的历史 Java1.0在发布的时候,就为我们提供了GUI操作的库,这个库系统在所有的平台下都可以运行,这套基本的类库被称作抽象窗口工具集(Abstract Window Toolit),简称 ...
- Python软件目录结构
目录组织方式 关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构.在Stackoverflow的这个问题上,能看到大家对Python目录结构的讨论. 这里面说的已经很好了, ...
- FlashFXP链接到服务器上,如果www目录下的文件隐藏
FlashFXP链接到服务器上,如果www目录下的文件隐藏,那么请按照如下设置,就可以显示隐藏的文件了 [站点]->[站点管理器]->选项,然后按照如下设置:
- 【LeetCode】1101. The Earliest Moment When Everyone Become Friends 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 并查集 日期 题目地址:https://leetcod ...
- LeetCode1239串联字符串的最大长度
题目 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解. 请返回所有可行解 s 中最长长度. 解题 ...
- 1170 - Counting Perfect BST
1170 - Counting Perfect BST PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...
- 前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
一.背景:页面为何会卡? 1.1 等待时间长(性能) 项目本身包/第三方脚本比较大. JavaScript 执行阻塞页面加载. 图片体积大且多. 特别是对于首屏资源加载中的白屏时间,用户等待的时间就越 ...
- Linux磁盘实用指令
磁盘情况查询 df/du 查询磁盘整体占用情况 df 指令:df -h 查询目录磁盘占用情况 du 基本语法 指令:du [选项] 指定目录 常用选项 指定目录不填则默认当前目录 选项 功能 -s 指 ...
- Java初学者作业——编写JAVA程序,在控制台中输入六位员工的姓名,通过随机点名方式,输出当选组长的员工姓名。
返回本章节 返回作业目录 需求说明: 编写JAVA程序,在控制台中输入六位员工的姓名,通过随机点名方式,输出当选组长的员工姓名. 实现思路: (1)定义字符串类型的数组names,长度为6,用于存储六 ...