Spring 的事务传播机制

embedded/2024/10/30 18:20:25/

Spring 的事务传播机制定义了一个事务方法在遇到已经存在的事务时如何处理。事务传播属性(Propagation)提供了七种机制,以适应不同的业务需求和事务边界管理。

1. Spring 的事务传播机制的类型

(1)REQUIRED(默认传播机制)
  • 描述:如果当前存在事务,则加入该事务;如果没有,则创建一个新事务。
  • 应用场景:适用于大多数情况,因为它遵循“有事务则加入,无事务则创建”的逻辑。
(2)REQUIRES_NEW
  • 描述:无论当前是否存在事务,总是创建一个新事务,并且挂起当前事务(如果有)。
  • 应用场景:适合必须独立于现有事务的场景,比如在一个事务中写操作日志,不受外层事务回滚影响。
(3)SUPPORTS
  • 描述:如果当前存在事务,则加入该事务;如果没有,则以非事务方式执行。
  • 应用场景:适合既可以在事务内执行,也可以在事务外执行的查询操作。
(4)MANDATORY
  • 描述:如果当前存在事务,则加入该事务;如果没有,则抛出异常。
  • 应用场景:适合必须在事务内执行的场景,确保调用方已开启事务。
(5)NOT_SUPPORTED
  • 描述:以非事务方式执行操作,如果当前存在事务,则挂起该事务。
  • 应用场景:适合不需要事务控制,且不希望受到其他事务影响的场景。
(6)NEVER
  • 描述:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  • 应用场景:适合必须在无事务环境中运行的场景。
(7)NESTED
  • 描述:如果当前存在事务,则在嵌套事务中执行;如果没有,则创建一个新事务。
  • 应用场景:适合需要在一个主事务中划分子事务的情况。嵌套事务可以单独回滚而不影响外层事务。

2. 事务传播机制的实现原理

Spring 的事务传播机制基于 AOP(面向切面编程)和事务管理器(如 DataSourceTransactionManager)实现。在调用事务方法时,Spring 会检查当前上下文中是否存在活动事务,并根据传播机制决定如何处理事务。

工作原理:
  1. AOP 拦截方法调用:当调用一个带有 @Transactional 注解的方法时,Spring AOP 会拦截该方法。

  2. 获取事务上下文:Spring 会通过事务管理器检查当前上下文中是否已经存在事务。

  3. 事务管理器检查事务传播属性:根据传播机制的不同,Spring 决定如何处理当前事务:

    • 如果是 REQUIRED,则加入当前事务或创建新事务。
    • 如果是 REQUIRES_NEW,则挂起当前事务,创建一个新事务。
    • 其他机制类似。
  4. 事务同步:Spring 事务管理器会与底层的资源(如数据库连接)同步,确保所有操作在同一事务中执行,保证一致性。

  5. 提交或回滚:根据方法的执行情况,Spring 事务管理器会在方法结束时决定是否提交或回滚事务。如果发生异常,事务管理器根据异常类型和回滚策略进行回滚。

事务传播的边界管理

通过事务管理器,Spring 可以精确控制事务的生命周期,传播机制用于在嵌套调用和复杂业务逻辑中实现更细粒度的事务边界管理,确保事务逻辑与业务需求一致。

3. 常见的应用场景和注意事项

  • 默认使用 REQUIRED:对于绝大多数情况,使用 REQUIRED 是足够的,特别是对于一个整体业务逻辑的开始方法。
  • 日志记录使用 REQUIRES_NEW:日志或审计记录通常使用 REQUIRES_NEW,确保不受外层事务的回滚影响。
  • 避免事务嵌套死锁:对于使用 NESTED 事务的嵌套场景,尽量确保嵌套事务资源不与外层事务资源冲突,避免死锁。

总结来说,Spring 事务传播机制为开发者提供了灵活的事务边界管理,适应各种业务需求。通过传播机制,开发者可以根据业务需求确保操作的原子性和隔离性。


http://www.ppmy.cn/embedded/133669.html

相关文章

sqlyog软件

SQLyog:SQLyog的下载、安装-CSDN博客 navicat与SQLyog的区别_sqlyog和navicat-CSDN博客 MySQL是一个功能齐全的关系数据库管理系统,软件是开源的,MySQL数据库服务器速度快、可靠性高,扩展性强,且易于使用。 MySQL与…

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域,我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer(MMDiT)驱动的文本到图像模型,它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…

JavaSE笔记3】面向对象高级

目录 拓1:私有方法的优点 拓2:静态方法的优点 拓3:类的五大成分 拓4:硬编码和软编码 一、static 1. 概念 2. 成员变量在内存中执行原理 3. 类变量(静态变量)的使用场景 4. 两种成员变量 5. 两种成员方法 6. 类方法的使用场景 7.…

bug-JavaArrays.fill()隐藏问题

对于一个数组想要初始一样的值,我们经常会这样编写。全部进行复制1,但是你有没有考虑过,如果是一个对象数组呢? 如果也是new Thread,这个是有五个线程,还是一个线程? 这是我在今天做哲学家问题时候遇到的…

python通过translate库实现中英文翻译

功能介绍 translate库,可以轻松实现中英文的翻译。 使用pip直接安装translate库:pip install translate translate库github地址 命令行直接调用 当使用pip安装以后,就得到了translate-cli的命令,此时可以通过该命令直接实现翻…

【Python爬虫实战】多进程结合 BeautifulSoup 与 Scrapy 构建爬虫项目

#1024程序员节|征文# 🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 前言 在大数据时代,爬虫技术是获取和处理网络数据的利器。面对需要处理大…

安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用

00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中,时间与效率直接决定着患者的生命。传统急救模式下,急救人员常通过视频或电话与医院医生进行沟通,以描述患者状况并依照指令行动。然而,这种信息传递方式往往因信息不完整或传递延…

[论文阅读] GPT-4 Technical Report

启发: 读了吗,如读,不愧是CloseAI Abstract GPT-4 是一个基于 Transformer 的模型,经过预先训练,用于预测文档中的下一个标记。训练后的对齐过程可以提高事实性和对期望行为的依从性方面的表现。该项目的一个核心组成…