Spring 事务传播行为
目录
前言
一、spring事务传播行为是什么?
二、Spring事务传播行为的七种类型。
三、注意事项。
1. 调用者和被调用者都没发生异常。
2. 调用者调用完当前方法后,调用者抛出业务异常,怎么回滚?
3. 当前方法发生异常,调用者捕获当前方法的业务异常,怎么回滚?
4. 当前方法发生异常,调用者不捕获当前方法的异常,怎么回滚?
总结
前言
随着spring框架的不断发展,spring框架也越来越重要,很多人都开启了spring框架学习,本文就介绍了spring框架中的一个基础内容------spring事务传播行为。
一、Spring事务传播行为是什么?
事务传播行为指的就是当一个事务方法(当前事务)被另一个事务方法(调用者)调用时,这个事务方法(当前事务)对另一个事务方法(调用者)的态度。
简单说就是:事务方法A调用了事务方法B,B需要怎么应对。
二、Spring事务传播行为的七种类型。
事务传播行为类型 | 说明 |
PROPAGATION_REQUIRED |
表示当前方法必须在事务中运行。 如果调用者有事务,则当前方法加入到调用者事务中运行。 如果调用者没有事务,则当前方法自己新开启一个事务运行。 |
PROPAGATION_SUPPORTS |
表示当前方法不必在事务中运行。 如果调用者有事务,则当前方法加入到调用者事务中运行。 如果调用者没有事务,则当前方法以非事务的形式运行。 |
PROPAGATION_MANDATORY |
表示当前方法必须在调用者事务中运行。 如果调用者有事务,则当前方法加入到调用者事务中运行。 如果调用者没有事务,则当前方法抛出异常。 |
PROPAGATION_NESTED |
表示当前方法必须在事务中运行。 如果调用者有事务,则当前方法以“嵌套事务”的形式加入到调用者事务中运行。 如果调用者没有事务,则当前方法自己新开启一个事务运行。 |
PROPAGATION_NEVER |
表示调用者必须以非事务形式运行。 如果调用者有事务,则抛出异常。 如果调用者没有事务,则当前方法以非事务的形式运行。 |
PROPAGATION_REQUIRES_NEW |
表示当前方法必须在事务中运行。 如果调用者有事务,则当前方法自己新开启一个事务运行。 如果调用者没有事务,则当前方法当前方法自己新开启一个事务运行。 |
PROPAGATION_NOT_SUPPORTED |
表示当前方法不支持在事务中运行。 如果调用者有事务,则挂起调用者的事务,当前方法以非事务的形式运行。 如果调用者没有事务,则当前方法以非事务的形式运行。 |
三、注意事项。
1. 调用者和被调用者都没发生异常。
事务传播行为类型 | 调用者是否存在事务 | 结果 |
PROPAGATION_REQUIRED | 是 |
当前方法加入调用者的事务。 |
否 |
当前方法自己新开启一个事务运行。 |
|
PROPAGATION_SUPPORTS | 是 |
当前方法加入调用者的事务。 |
否 |
当前方法以非事务的形式运行。 |
|
PROPAGATION_MANDATORY | 是 |
当前方法加入调用者的事务。 |
否 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) |
|
PROPAGATION_NESTED | 是 |
当前方法以”嵌套事务“的形式加入调用者的事务。 |
否 |
当前方法自己新开启一个事务运行。 |
|
PROPAGATION_NEVER | 是 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) |
否 |
当前方法以非事务的形式运行。 |
|
PROPAGATION_REQUIRES_NEW | 是 |
当前方法自己新开启一个事务运行。 |
否 |
当前方法自己新开启一个事务运行。 |
|
PROPAGATION_NOT_SUPPORTED | 是 |
当前方法以非事务的形式运行。 |
否 |
当前方法以非事务的形式运行。 |
2. 调用者调用完当前方法后,调用者抛出业务异常,怎么回滚?
事务传播行为类型 | 调用者是否存在事务 | 结果 |
PROPAGATION_REQUIRED | 是 |
当前方法加入调用者的事务。 调用者抛出异常后,一起回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者抛出异常后,调用者已执行的SQL不回滚。 当前方法的事务不回滚。 |
|
PROPAGATION_SUPPORTS | 是 |
当前方法加入调用者的事务。 调用者抛出异常后,调用者和当前方法一起回滚。 |
否 |
当前方法以非事务的形式运行。 调用者抛出异常后,调用者已执行的SQL不回滚。 当前方法已执行的SQL不回滚。 |
|
PROPAGATION_MANDATORY | 是 |
当前方法加入调用者的事务。 调用者抛出异常后,调用者和当前方法一起回滚。 |
否 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) |
|
PROPAGATION_NESTED | 是 |
当前方法以”嵌套事务“的形式加入调用者的事务。 调用者抛出异常后,调用者和当前方法一起回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者抛出异常后,调用者已执行的SQL不回滚。 当前方法的事务不回滚。 |
|
PROPAGATION_NEVER | 是 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) |
否 |
当前方法以非事务的形式运行。 调用者抛出异常后,调用者已执行的SQL不回滚。 当前方法已执行的SQL不回滚。 |
|
PROPAGATION_REQUIRES_NEW | 是 |
当前方法自己新开启一个事务运行。 调用者抛出异常后,调用者的事务回滚。 当前方法的事务不回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者抛出异常后,调用者已执行的SQL不回滚。 当前方法的事务不回滚。 |
|
PROPAGATION_NOT_SUPPORTED | 是 |
当前方法以非事务的形式运行。 调用者抛出异常后,调用者的事务回滚。 当前方法已执行的SQL不回滚。 |
否 |
当前方法以非事务的形式运行。 调用者抛出异常后,调用者已执行的SQL不回滚。 当前方法已执行的SQL不回滚。 |
3. 当前方法发生异常,调用者捕获当前方法的业务异常,怎么回滚?
事务传播行为类型 | 调用者是否存在事务 | 结果 |
PROPAGATION_REQUIRED | 是 |
当前方法加入调用者的事务。 调用者提交事务时,抛出Spring异常。 (不允许存在该场景) 当前方法和调用者在同一个事务中,一起回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者以非事务的形式运行。 当前方法的事务回滚,调用者正常运行。 |
|
PROPAGATION_SUPPORTS | 是 |
当前方法加入调用者的事务。 调用者提交事务时,抛出Spring异常。 (不允许存在该场景) 当前方法和调用者在同一个事务中,一起回滚。 |
否 |
当前方法以非事务的形式运行。 调用者以非事务的形式运行。 当前方法的已运行的SQL不回滚,调用者正常运行。 |
|
PROPAGATION_MANDATORY | 是 |
当前方法加入调用者的事务。 调用者提交事务时,抛出Spring异常。 (不允许存在该场景) 当前方法和调用者在同一个事务中,一起回滚。 |
否 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) 调用者已运行的SQL不回滚。 |
|
PROPAGATION_NESTED | 是 |
当前方法以“嵌套事务”的形式加入到调用者事务中运行。 当前方法的“嵌套事务”回滚。 调用者的事务不回滚,正常运行。 |
否 |
当前方法自己新开启一个事务运行。 调用者以非事务的形式运行。 当前方法的事务回滚,调用者正常运行。 |
|
PROPAGATION_NEVER | 是 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) 调用者事务回滚。 |
否 |
当前方法以非事务的形式运行。 调用者以非事务的形式运行。 当前方法的已运行的SQL不回滚,调用者正常运行。 |
|
PROPAGATION_REQUIRES_NEW | 是 |
当前方法自己新开启一个事务运行。 调用者以事务的形式运行。 当前方法抛出异常,当前方法事务回滚。 调用者方法正常运行。 |
否 |
当前方法自己新开启一个事务运行。 调用者以非事务的形式运行。 当前方法抛出异常,当前方法事务回滚。 调用者方法正常运行。 |
|
PROPAGATION_NOT_SUPPORTED | 是 |
当前方法以非事务的形式运行。 调用者的事务在当前方法执行期间会被挂起,当前方法执行结束后恢复。 当前方法抛出异常,当前方法已执行的SQL不回滚。 调用者正常运行。 |
否 |
当前方法以非事务的形式运行。 调用者以非事务的形式运行。 当前方法抛出异常,当前方法已执行的SQL不回滚。 调用者正常运行。 |
4. 当前方法发生异常,调用者不捕获当前方法的异常,怎么回滚?
事务传播行为类型 | 调用者是否存在事务 | 结果 |
PROPAGATION_REQUIRED | 是 |
当前方法加入调用者的事务。 调用者抛出当前方法的异常。 当前方法和调用者在同一个事务中,一起回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者以非事务的形式运行。 当前方法的事务回滚。 调用者抛出当前方法的异常,已执行的SQL不回滚。 |
|
PROPAGATION_SUPPORTS | 是 |
当前方法加入调用者的事务。 调用者抛出当前方法的异常。 当前方法和调用者在同一个事务中,一起回滚。 |
否 |
当前方法以非事务的形式运行。 调用者以非事务的形式运行。 当前方法的已运行的SQL不回滚, 调用者抛出当前方法的异常,已运行的SQL不回滚。 |
|
PROPAGATION_MANDATORY | 是 |
当前方法加入调用者的事务。 调用者抛出当前方法的异常, 当前方法和调用者在同一个事务中,一起回滚。 |
否 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) 调用者抛出Spring的异常,已运行的SQL不回滚。 |
|
PROPAGATION_NESTED | 是 |
当前方法以“嵌套事务”的形式加入到调用者事务中运行。 调用者抛出当前方法的异常, 当前方法的“嵌套事务”回滚。 调用者的事务回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者以非事务的形式运行。 当前方法的事务回滚。 调用者抛出当前方法的异常,已运行的SQL不回滚。 |
|
PROPAGATION_NEVER | 是 |
调用者调用当前方法时,抛出Spring异常。 (不允许存在该场景) 调用者抛出Spring的异常,事务回滚。 |
否 |
当前方法以非事务的形式运行。 调用者以非事务的形式运行。 当前方法抛出异常,已运行的SQL不回滚。 调用者抛出异常,已运行的SQL不回滚。 |
|
PROPAGATION_REQUIRES_NEW | 是 |
当前方法自己新开启一个事务运行。 调用者以事务的形式运行。 当前方法抛出异常,当前方法事务回滚。 调用者方法抛出异常,调用者事务回滚。 |
否 |
当前方法自己新开启一个事务运行。 调用者以非事务的形式运行。 当前方法抛出异常,当前方法事务回滚。 调用者方法抛出异常,调用者已执行的SQL不回滚。 |
|
PROPAGATION_NOT_SUPPORTED | 是 |
当前方法以非事务的形式运行。 调用者在当前方法执行期间,事务会被挂起。 当前方法抛出异常,当前方法已执行的SQL不回滚。 调用者抛出异常,调用者事务回滚。 |
否 |
当前方法以非事务的形式运行。 调用者以非事务的形式运行。 当前方法抛出异常,当前方法已执行的SQL不回滚。 调用者抛出异常,调用者已执行的SQL不回滚。 |
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Spring事务传播行为,而工作中的业务往往非常复杂,需要大家更加认真。
Spring 事务传播行为相关推荐
- spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?
AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...
- 原创 | CRUD更要知道的Spring事务传播机制
来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...
- Spring事务传播性与隔离级别
为什么80%的码农都做不了架构师?>>> 事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题. 事务最重要的两个特性,是事务的传 ...
- Spring事务传播特性实例解析
背景介绍 目前系统正在进行代码重构前期预研工作,目标采用spring控制事务以减少开发代码量,提高开发效率.同时避免开发人员编码控制事务所带来的链接没有释放,事务没有提交,出现异常事务没有回滚的Bug ...
- Spring事务传播行为详解
前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...
- 太难了~面试官让我结合案例讲讲自己对Spring事务传播行为的理解!
摘要: 原创出处 sf.gg/a/1190000013341344 「handaqiang」欢迎转载,保留摘要,谢谢! 前言 基础概念 1. 什么是事务传播行为? 2. Spring 中七种事务传播行 ...
- Spring事务传播属性和隔离级别
Spring事务传播属性和隔离级别 一.Spring事务传播属性(Propagation): 1) REQUIRED(默认属性) 如果存在一个事务,则支持当前事务.如果没有事务则开启一个新的事务. ...
- 什么是事务、事务特性、事务隔离级别、spring事务传播特性
1.什么是事务: 事务是指程序中的一个操作序列.其特点是:该序列的所有操作要么全部成功完成,要么只要有一个操作失败,则该序列所有操作都将被撤销.这也是事务的原子性(要么成功,要么失败). 2.事务特性 ...
- Spring事务传播行为7种类型 --- 看一遍就能记住!
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.Spring 事务传播行为一共有7种类型,主要分为3类: 1)支持当前事物. 2)不支持当前事务 ...
- Spring 事务传播原理及数据库事务操作原理
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 先看看 Spring 事务的基础配置 <beans xmlns="http://www.springframework.org/ ...
最新文章
- 嵌入式C程序基础与编程结构
- 【OpenCV十六新手教程】OpenCV角检测Harris角点检测
- java多线程之API初探(一)
- leetcode 470. 用 Rand7() 实现 Rand10()
- 第一行代码学习笔记第五章——详解广播机制
- win7 oracle启动监听,win7系统oracle监听服务无法打开的解决方法
- 解决IE中img.onload失效的方法
- 部署自己的tomcat,让tomcat和IIS共同享用服务器的80端口
- 分布式定时任务框架选型,写得太好了!
- 各大厂商CTR广告预估模型的优缺点对比
- 手机都可以直接敲R了,还要电脑干嘛
- java实现pdf打印工具类,Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚)...
- easyui-combobox之setText与setValue先后之分
- 无线充电设计(一)-基本介绍
- 虚拟机Windows xp联网
- 经典FAT文件系统格式详解
- 从实际案例聊聊JDK 17 的GC优化
- Nat Commun:中国中医科学院黄璐琦院士/首都医科大学高伟教授团队联合解析雷公藤甲素生物合成关键C-14位羟化机制...
- REST接口安全认证方式对比:API Key vs OAuth令牌 vs JWT
- Oracle修改内存大小