Spring事务的传播行为
事务的传播特性
事务的传播特性就是当一个事务方法被另一个事务方法调用的时候,这个事务方法应该如何执行。
以 Java 为例,Java 的 Spring 框架中,使用注解的方式来使用事务非常简洁方便:
@Service
public class PersonServive {
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
System.out.println("run method a.");
methodB();
}
@Transactional(prapagation = Propagation.REQUIRES_NEW)
public void methodB() {
System.out.println("run method b.");
}
}
例子当中,方法 A 调用方法 B,两个方法都用注解显式的标识了开启的事务模式,其中方法 A 开启的是 PROPAGATION_REQUIRED
,方法 B 开启的是 PROPAGATION_REQUIRES_NEW
,这种传播机制下,就是方法 B 有自己的事务,出错就回滚,没出错就提交,对方法 A 是不会产生影响的,无论是方法 A 最后是回滚还是提交,对于方法 B 事务的执行,不会产生影响。两个事务都是互不影响。
Spring 中的七种事务传播机制
1. 不需要事务
PROPAGATION_NEVER
: 没有就非事务执行,有就抛异常。
PROPAGATION_NOT_SUPPORTED
: 没有就非事务执行,有就直接挂起,然后非事务执行
2. 可以有事务,也可以没有事务
PROPAGATION_SUPPORTS
: 调用者有事务就加入,一起在事务中执行,没有就非事务执行。
3. 一定需要事务
PROPAGATION_REQUIRES_NEW
: 有没有都新建事务,如果调用者有事务,就挂起调用者已经开启的。自己新建事务。
PROPAGATION_REQUIRED
: 如果没有,就新建一个事务,如果有,就加入当前事务,一起在事务中运行。Spring 默认是这种类型。
PROPAGATION_NESTED
: 如果没有事务,就新建一个事务,如果原来有,就在当前事务中嵌套其他事务。
PROPAGATOIN_MANDATORY
: 如果没有事务就报错,如果有事务,就参与当前事务,一起在事务中执行。
需要注意的是对于 PROPAGATION_NESTED
,里层事务的回滚,不会影响外层事务。但是,如果外层事务出异常回滚,里层的事务也会回滚,比如前面例子当中的方法 A 和方法 B,如果方法 A 回滚,方法 B 即使成功不报错可以提交,也会回滚。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 潘石屹用Python解决100个问题 | 字符类型统计
- 潘石屹用Python解决100个问题 | 分解质因数
- 使用Java Spring消费MySQL中的数据库存储过程
- 部署 Docker 及配置
- 【Spark on K8S】Spark里的k8s client
- 【每日一题】30. Substring with Concatenation of All Words
- MySQL选错索引导致的线上慢查询事故复盘
- 【Kubernetes】additionalPrinterColumns的配置
- ES使用json字符串索引文档时报错
- VUE 过滤输入框中的特殊字符 只保存中文、英文及数字
- Java 判断一个字符串是不是由数字组成
- 解决ES搜索过程中使用高亮插件导致结果不完整的问题
- Java selenuim用执行js模拟鼠标滚动的方式
- 使用puppeteer 进行批量网页截图
- dubbo 配置优先级 集群模式 负载均衡策略