目录

前言

一、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 事务传播行为相关推荐

  1. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  2. 原创 | CRUD更要知道的Spring事务传播机制

    来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...

  3. Spring事务传播性与隔离级别

    为什么80%的码农都做不了架构师?>>>    事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题. 事务最重要的两个特性,是事务的传 ...

  4. Spring事务传播特性实例解析

    背景介绍 目前系统正在进行代码重构前期预研工作,目标采用spring控制事务以减少开发代码量,提高开发效率.同时避免开发人员编码控制事务所带来的链接没有释放,事务没有提交,出现异常事务没有回滚的Bug ...

  5. Spring事务传播行为详解

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...

  6. 太难了~面试官让我结合案例讲讲自己对Spring事务传播行为的理解!

    摘要: 原创出处 sf.gg/a/1190000013341344 「handaqiang」欢迎转载,保留摘要,谢谢! 前言 基础概念 1. 什么是事务传播行为? 2. Spring 中七种事务传播行 ...

  7. Spring事务传播属性和隔离级别

    Spring事务传播属性和隔离级别 一.Spring事务传播属性(Propagation): 1) REQUIRED(默认属性) 如果存在一个事务,则支持当前事务.如果没有事务则开启一个新的事务.  ...

  8. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是指程序中的一个操作序列.其特点是:该序列的所有操作要么全部成功完成,要么只要有一个操作失败,则该序列所有操作都将被撤销.这也是事务的原子性(要么成功,要么失败). 2.事务特性 ...

  9. Spring事务传播行为7种类型 --- 看一遍就能记住!

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.Spring 事务传播行为一共有7种类型,主要分为3类: 1)支持当前事物. 2)不支持当前事务 ...

  10. Spring 事务传播原理及数据库事务操作原理

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 先看看 Spring 事务的基础配置 <beans xmlns="http://www.springframework.org/ ...

最新文章

  1. 嵌入式C程序基础与编程结构
  2. 【OpenCV十六新手教程】OpenCV角检测Harris角点检测
  3. java多线程之API初探(一)
  4. leetcode 470. 用 Rand7() 实现 Rand10()
  5. 第一行代码学习笔记第五章——详解广播机制
  6. win7 oracle启动监听,win7系统oracle监听服务无法打开的解决方法
  7. 解决IE中img.onload失效的方法
  8. 部署自己的tomcat,让tomcat和IIS共同享用服务器的80端口
  9. 分布式定时任务框架选型,写得太好了!
  10. 各大厂商CTR广告预估模型的优缺点对比
  11. 手机都可以直接敲R了,还要电脑干嘛
  12. java实现pdf打印工具类,Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚)...
  13. easyui-combobox之setText与setValue先后之分
  14. 无线充电设计(一)-基本介绍
  15. 虚拟机Windows xp联网
  16. 经典FAT文件系统格式详解
  17. 从实际案例聊聊JDK 17 的GC优化
  18. Nat Commun:中国中医科学院黄璐琦院士/首都医科大学高伟教授团队联合解析雷公藤甲素生物合成关键C-14位羟化机制...
  19. REST接口安全认证方式对比:API Key vs OAuth令牌 vs JWT
  20. Oracle修改内存大小

热门文章

  1. 程序员发布:一张图读懂支撑阿里双十一1682亿的技术架构体系
  2. 番茄助手功能及快捷键
  3. MySQL 的 help 命令你真的会用吗?
  4. Pyppeteer使用代理IP(需要权限验证)
  5. 计算机音乐卡内基大学,卡耐基梅隆大学音乐暑期课程 年轻音乐家的成功之路...
  6. NetBeans IDE12.3无法卸载
  7. Flixel横板游戏制作教程(十一)—JetPack(飞行背包)
  8. sql server 不是可以识别的 内置函数名称
  9. html5 网易公开课,麻省理工学院公开课:单变量微积分习题课
  10. 主动扫描技术nmap详解