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 即使成功不报错可以提交,也会回滚。
- 记一次数据同步需求的改进(二) (r7笔记第5天)
- Python信贷数据处理与初步分析(ZIP解压)
- web前端之锋利的jQuery八:jQuery插件的使用(表单验证、表单提交)
- 优化算法——牛顿法(Newton Method)
- merge语句导致的CPU使用率过高的优化(r7笔记第4天)
- 由dual导致的一个潜在的监控问题(r7笔记第3天)
- 剑指Offer——编程题的Java实现
- Python中if __name__ == "__main__": 的作用
- 每周算法练习——大数的乘法问题
- Java基础-25(01)图形用户界面编程GUI
- 每周算法练习——n皇后问题
- dg broker配置的问题及分析 (r7笔记第22天)
- 备库搭建中的一波三折(r7笔记第21天)
- Java基础-25(02)图形用户界面编程GUI
- 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 文档注释
- Android自定义酒店日期选择器
- Android实现apk插件方式换肤的实例讲解
- 基于Spark Graphx实现ID-Mapping
- Nginx keepalived一主一从高可用,手把手带你一步一步配置!
- Android实现自动轮询的RecycleView
- Android自定义钟表特效
- Android MediaPlayer 音频倍速播放 调整播放速度问题
- Android 简单实现倒计时功能
- Android Canvas自定义实现时钟效果
- 虚拟机kali安装vmtools
- Android动画学习笔记之补间动画
- [- Flutter 数据&状态篇 -] setState
- flutter 自定义websocket路由的实现
- Flutter开发之路由与导航的实现
- Android BSearchEdit 搜索结果选择框的实例代码