一.什么是事务传播性

大白话讲就是,方法之间互相调用的时候,事务如何传播,比如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. SDP 格式解析

    一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...

  2. MySQL查询列必须和group by字段一致吗?

    @ 目录 场景:查询各部门薪水最高的员工. 方法一: 方法二: MySQL group by是如何决定哪一条数据留下的? 分组前的数据: 那么target list和group by column不匹 ...

  3. Lucene 基础类型

    Lucene 索引文件中,用一下基本类型来保存信息:1. Byte:是最基本的类型,长 8 位(bit).2. UInt32:由 4 个 Byte 组成.3. UInt64:由 8 个 Byte 组成 ...

  4. 一个c++11自定义的信号量

    1.关于 This is from here But I did some changes. 2. semaphore.h /** @ brief : this is from https://sta ...

  5. 【LeetCode】15. 3Sum 三数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...

  6. 【Java例题】5.4 排序集合的使用

    4.排序集合的使用.使用TreeSet模拟一个一维整数数组.其中,一维整数数组元素由Random类随机产生.最后显示排序后的结果. package chapter6; import java.util ...

  7. 第三十个知识点:大致简述密钥协商中的BR安全定义。

    第三十个知识点:大致简述密钥协商中的BR安全定义. 在两方之间建密钥共享是一件密码学中古老的问题.就算只考虑定义也比标准加密困难的多.尽管古典的Diffie-Hellman协议在1976年思路解决了这 ...

  8. Deep Residual Learning for Image Recognition (ResNet)

    目录 主要内容 代码 He K, Zhang X, Ren S, et al. Deep Residual Learning for Image Recognition[C]. computer vi ...

  9. 编写Java程序_定义两个方法,实现奇数偶数的判断,并计算和(有参数有返回值方法)

    需求说明: 定义两个方法,在控制台输入一个数字,这两个方法可以求出1到该数字之间所有偶数之和.奇数之和,并将对应结果和返回.在main方法中调用该方法,并在控制台打印出结果.(有参数有返回值方法) 运 ...

  10. 使用docker-compose部署Kafka集群

    之前写过Kafka集群的部署,不过那是基于宿主机的,地址:Kafka基础教程(二):Kafka安装 和Zookeeper一样,有时想简单的连接Kafka用一下,那就需要开好几台虚拟机,如果Zookee ...