不同的事务,在 Spring中是如何传播的?

Spring 的不同事务传播行为 综上所述,PROPAGATION_REQUIRES_NEW事务主要用于需要确保某些操作在独立事务中完成的场景。通过合理使用该传播行为,可以确保这些操作的原子性和独立性,从而提高应用的健壮性和可靠性。综上所述,PROPAGATION_NESTED事务主要用于复杂业务操作、保存点回滚和事务隔离等场景。通过合理使用该传播行为,可以确保业务操作的原子性和独立性,从而提高应用的健壮性和可靠性。PROPAGATION_NESTED是Spring事务管理中的一种传播行为,它允许在当前事务中嵌套一个新的事务。 阅读详情

Spring 事务传播行为(Propagation Behavior)定义了一个事务方法被另一个事务方法调用时事务的边界和行为。这篇文章,我们将深度分析它们的原理以及对比它们之间的差异。

1. 事务传播行为概述

在 Spring 中,Propagation 枚举类型定义了七种主要的事务传播行为:

  1. REQUIRED
  2. REQUIRES_NEW
  3. SUPPORTS
  4. NOT_SUPPORTED
  5. MANDATORY
  6. NEVER
  7. NESTED

此外,NESTED 传播行为在某些数据源(如支持嵌套事务的数据库)下可用。

2. 原理分析

事务传播行为主要决定了在一个事务方法被调用时,当前存在的事务(如果有)应该如何被处理。以下是其原理分析:

  • 事务的存在检查:当一个方法(被调用者)执行时,它会检查调用它的方法(调用者)是否存在活动事务。
  • 决定是否挂起、重用或创建新事务:根据传播行为的不同,调用者可能会被挂起,或者调用者的方法可能会加入到现有事务中,或者开启一个全新的事务。
  • 事务的边界控制:传播行为还控制了事务的提交和回滚边界,确保在复杂调用链中事务的一致性与完整性。

3. 各种传播行为的示例分析

3.1 REQUIRED

定义:支持当前事务。如果没有事务,就新建一个事务。

原理:调用者存在事务,方法加入到这个事务中;否则,开启新事务。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // 执行数据库操作
}

分析:methodA 开启事务,methodB 加入到同一个事务中。如果 methodA 回滚,methodB 也会回滚。

3.2 REQUIRES_NEW

定义:新建事务,如果存在事务,就将当前事务挂起。

原理:无论调用者是否存在事务,方法都会开启一个独立的新事务。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // 执行数据库操作
}

分析:methodA 和 methodB 各自有独立的事务。如果 methodB 回滚,不会影响 methodA 的事务。

3.3 SUPPORTS

定义:支持当前事务,如果存在事务,就加入;否则,以非事务方式执行。

原理:依赖调用者是否有事务,调用者有则参与事务,无则不使用事务。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
}

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // 执行数据库操作
}

分析:如果 methodA 调用 methodB,methodB 会参与 methodA 的事务。如果 methodB 被独立调用,则以非事务方式执行。

3.4 NOT_SUPPORTED

定义:以非事务方式执行操作,如果存在事务,就将其挂起。

原理:方法不支持事务,即使调用者有事务,也不会参与。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
    // 执行数据库操作
}

分析:methodA 的事务会在执行 methodB 时被挂起,methodB 以非事务方式执行,执行完毕后恢复 methodA 的事务。

3.5 MANDATORY

定义:支持当前事务,必须存在一个事务,否则抛出异常。

原理:如果调用者有事务,方法参与;否则,抛出 IllegalTransactionStateException。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
}

@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // 执行数据库操作
}

分析:当 methodA 调用 methodB 时,由于 methodA 有事务,methodB 可以正常参与事务。如果 methodB 被独立调用,无事务,会抛出异常。

3.6 NEVER

定义:以非事务方式执行,如果存在事务,则抛出异常。

原理:方法绝不支持事务,确保其执行不在事务上下文中。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
}

@Transactional(propagation = Propagation.NEVER)
public void methodB() {
    // 执行数据库操作
}

分析:当 methodA 调用 methodB 时,由于 methodA 有事务,调用 methodB 会抛出异常。如果 methodB 被独立调用,无事务,则正常执行。

3.7 NESTED

定义:如果存在事务,则在嵌套事务内执行;否则,类似于 REQUIRED。

原理:基于底层数据库的保存点(savepoint),允许在嵌套事务中回滚到保存点,而不影响外部事务。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 执行数据库操作
    methodB();
    // 继续执行
}

@Transactional(propagation = Propagation.NESTED)
public void methodB() {
    // 执行数据库操作
}

分析:如果 methodB 出现异常且事务被回滚,只会回滚到 methodB 的开始,而 methodA 的事务仍然可以继续或回滚。

4. 传播行为对比

传播行为是否必须存在事务是否开启新事务是否挂起现有事务适用场景REQUIRED否否否默认行为,绝大多数场景使用,如服务层方法。REQUIRES_NEW否是是需要独立事务,如日志记录,不受外部事务影响。SUPPORTS否否否可选事务性,读操作等,既能在事务中也能在非事务中运行。NOT_SUPPORTED否否是非事务操作,如与事务无关的外部系统交互。MANDATORY是否否强制要求存在事务的操作,确保方法调用在事务环境中。NEVER否否是确保方法在非事务环境中执行,避免事务上下文。NESTED否基于底层支持否需要在事务内进行部分回滚的场景,如复杂业务操作。

4.1 关键差异点

  • 是否开启新事务:REQUIRES_NEW 和 NESTED 可以开启新事务,其他大部分属于参与现有事务或非事务。
  • 是否必须存在事务:MANDATORY 和 NEVER 针对事务的存在有严格要求。
  • 是否挂起现有事务:REQUIRES_NEW 和 NOT_SUPPORTED 会挂起当前事务。
  • 嵌套事务支持:NESTED 依赖于底层数据库的 savepoint 支持,允许在同一事务中进行局部回滚。

5. 实际应用中的选择

  • 大多数场景:使用 REQUIRED 是最合适的选择,因为它简化了事务管理,并且大多数情况下方法需要参与到调用者的事务中。
  • 独立事务需求:如日志记录、发送通知等,需要与主事务独立的操作,可以使用 REQUIRES_NEW。
  • 可选事务:对于既能在事务中运行也能在非事务中运行的操作,可以使用 SUPPORTS。
  • 确保非事务执行:若某操作必须在非事务环境下执行,如一些特定的外部系统调用,可以使用 NOT_SUPPORTED 或 NEVER。
  • 强制要求事务:在某些关键业务逻辑中,确保方法只能在事务中调用,可以使用 MANDATORY。
  • 局部回滚需求:在复杂业务场景下,需要对某部分操作进行局部回滚,可以考虑使用 NESTED,但需确保底层数据库支持。

6. 注意事项

  • 数据库支持:部分传播行为(如 NESTED)依赖于底层数据库的支持,使用前需要确认数据库和事务管理器的兼容性。
  • 事务管理器配置:正确配置 Spring 事务管理器(如 PlatformTransactionManager)对于事务传播行为的正常工作至关重要。
  • 事务边界设计:合理设计事务边界,避免过长的事务导致资源占用和性能问题。

7. 总结

本文,我们详细分析了 Spring 事务传播行为,掌握它们对于构建健壮的事务管理策略至关重要。通过合理选择合适的传播行为,可以确保在复杂的业务逻辑和调用链中,数据的一致性和系统的稳定性。开发人员应根据具体的业务需求和应用场景,灵活运用不同的传播行为,以达到最佳的事务管理效果。

【UE5】Vosk插件实战:离线语音识别与TTS朗读全流程解析 本文详细解析了如何在UE5中利用Vosk插件实现离线实时语音转文字功能。从环境配置、插件与模型准备,到核心C++组件封装与蓝图系统搭建,提供了完整的实战教程。重点解决了离线语音识别在游戏开发中的延迟、隐私和网络依赖问题,并演示了从语音识别到TTS朗读的完整交互闭环,为开发安全、实时的语音交互应用提供可靠方案。 阅读详情

相关推荐

百度地图小区边界爬取

百度地图 小区边界爬取 完整项目地址-github 数据源:百度地图api 项目结构 RESIDENTIALAREABOUNDARY │ ResidentialAreaBoundaryControl.py 主函数 │ ResidentialAreaBoundaryFunc.py 方法库 │ ├─Auxiliary │ crawelFunc.p...

fulin9452的博客 6400

【Spring】Spring不同事务传播行为测试

Spring不同的事务传播行为测试结果

sfh2018的博客 1963

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

不同的事务,在 Spring中是如何传播的??

REQUIREDSUPPORTSMANDATORYNEVERNESTED此外,NESTED传播行为在某些数据源(如支持嵌套事务的数据库)下可用。本文,我们详细分析了 Spring 事务传播行为,掌握它们对于构建健壮的事务管理策略至关重要。通过合理选择合适的传播行为,可以确保在复杂的业务逻辑和调用链中,数据的一致性和系统的稳定性。开发人员应根据具体的业务需求和应用场景,灵活运用不同的传播行为,以达到最佳的事务管理效果。

Java架构师之路的博客 587

易康eCognition9.0分类|规则集和机器学习的方法的面向对象的多尺度分割分类

基于易康eCognition9.0软件的规则集和机器学习的方法的面向对象的多尺度分割分类

weixin_46493028的博客 1万+

ui(new Ui::MainWindow)的解析

Ui命名空间的变量名,和默认空间的变量名虽然一样,但实际是两个不同的东西。所以构造函数中调用MainWindow是没问题的,因为它不是在调用自身,而是在调用其他命名空间下的另一个同名的MainWindow类。这里使用C++的成员初始化列表语法,初始化成员变量指针ui,可这里有个问题,在MainWindow的构造函数中new 一个MainWindow,这又调用一下MainWindow的构造函数,这岂不是会死循环?ui_mainwindow.h文件。mainwindow.h文件.

sinat_31608641的博客 1193

Spring事务不同传播属性差异总结

Spring事务不同传播属性差异总结

java_s_firend的博客 423

CANdb++实战:5步搞定汽车电子DBC文件创建(附信号映射技巧)

本文详细介绍了使用CANdb++高效创建汽车电子DBC文件的五步实战流程,涵盖信号批量创建、报文关联、节点映射等核心技巧。文章重点解析了信号映射中的Motorola/Intel格式选择、多路复用信号处理等高级应用,并提供了从通信矩阵到可测试DBC的完整案例,帮助工程师大幅提升工作效率。

ss78901的博客 943

Spring 如何处理不同的事务传播行为和隔离级别?

Spring 通过 AOP 代理拦截事务性方法调用,利用作为策略接口来执行具体的事务操作,并借助在线程级别上管理事务状态和资源。这种设计将复杂的事务控制逻辑与业务代码解耦,使得开发者可以通过简单的注解来灵活地控制事务的传播行为和隔离级别,从而构建出稳定、可靠的应用程序。

专注于技术分享 789

美团外卖 mtgsig 1.2 逆向工程与补环境实战指南

本文深入解析了美团外卖核心风控参数mtgsig 1.2的生成机制与逆向实战。通过拆解其复杂的JSON结构,揭示了设备指纹、环境信息加密等关键字段。重点阐述了在Node.js中模拟浏览器环境(补环境)的核心方法,包括DOM/BOM对象、本地存储及Canvas/WebGL等高级指纹的模拟技巧,为安全研究和合规自动化测试提供了一套完整的技术指南。

uber9的博客 409

SpringBoot 系列教程(二):SpringBoot使用Devtools实现热部署

1.devtools   spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。 2.项目搭建   本文是采用IDEA搭建的Spring Boot应用,通过spring-boot-devtools配置,可以支持修改java文件会自动重启程序,一些资源无需触发重启,...

Thinkingcao的专栏 1215

mysql 不同连接的事务 会嵌套_嵌套事务、挂起事务,Spring 是怎样给事务又实现传播特性的?

Spring 做为风靡世界的Java 开源框架,发挥着举足轻重的作用。那你有没有想过, Spring 内部又是怎么样实现的事务呢?Spring 做为风靡世界的Java 开源框架,发挥着举足轻重的作用。那你有没有想过, Spring 内部又是怎么样实现的事务呢?而且 在 Spring 之中除了设置事务的「隔离级别」之外,还可以额外配置事务的「传播特性」。你要知道,传播特性里,有两个家伙比较特别,一个...

weixin_39891317的博客 97

10分钟搞定小红书爆款笔记爬取!Selenium模拟登录+数据解析全流程,新手也能落地

小红书爬虫实战的核心,是**“模拟真人操作+解析结构化数据”**——Selenium解决了动态页面和登录的问题,lxml解决了数据提取的问题,pandas解决了数据存储的问题。新手学爬虫不用一开始就啃复杂的反爬机制,先从这类“可见即可爬”的场景入手,掌握“模拟操作→数据解析→数据保存”的全流程,再逐步叠加异常处理、批量爬取、反爬应对等功能。需要注意的是:爬取数据仅用于个人学习和研究,不得用于商业用途,且需遵守小红书的用户协议,不要过度爬取导致服务器压力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1728

Spring事务传播行为

详解Spring中事务的七种传播行为

qq_52895663的博客 535

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring事务的传播机制

Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY;不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

qq_32424581的博客 7359

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring之事务传播行为

一、概念 首先简单了解一下Spring中事务传播行为是什么?听起来很高端,但是真正用起来的时候,稍有不慎,就会让自己陷入困境之中,所以在使用之前,我们必须要十分耐心认真的学习它。 从名字理解起来,事务传播行为,既然为传播就肯定发生在两个实体之间,否则单个实体又如何发生行为呢。通俗点讲就是“一个巴掌拍不响”。下面进入正规话题。 事务传播行为主要用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的事务中,该事务如何传播。这个概述可能不好理解,换句话就是当一个事务方法被另一个事务方法调用时,这个事务方法应

增量星球 5489

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring 事务和事务传播机制(详解)

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的Spring中使用事务,有两种方式:编程式事务(手动操作)和声明式事务.其中声明式事务使用较多,在方法上添加就可以实现了通过)设置事务的隔离级别.Spring 中的事务隔离级别有 5种通过设置事务的传播机制, Spring 中的事务传播级别有7种,重点关注REQUIRED(默认值)和。

2401_83177222的博客 2099

一篇文章带你读懂Spring 事务——事务的传播机制

spring事务传播机制

qq_52860170的博客 1323

Spring 事务的传播行为

Spring 事务的传播行为和隔离级别前提: 该事物是同一数据源事务,非分布式事务; 事务的传播行为和隔离级别书针对当前事务设置的; 事务的回滚条件,发生RuntimeException。所以,如果程序有自定义的exception的时候,必须集成RuntimeExcepion ,这样事务才能回滚。 事务的传播行为Spring中事务的定义: 一、Propagation :   key属性确定代理应

TStana的博客 711

spring 事务传播行为

参考资料: Spring事务传播机制&隔离级别 Spring事务管理与传播机制详解以及使用实例 一般,我们使用的都是spring提供的声明时事务。这里只做声明时事务的记录。 写代码时,一个方法需要事务,那么我们会使用spring的注解@transactional来声明时的标注该方法需要事务。 spring的事务传播行为 是使用@transactional的propagation...

maybe的博客 296

Spring声明式事务的传播行为

1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。7. NESTED:如果当前存在事务,则在嵌套事务内执行。2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。5. NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则挂起当前事务。4. REQUIRES_NEW:总是创建一个新的事务,如果当前存在事务,则挂起当前事务。6. NEVER:总是以非事务方式执行,如果当前存在事务,则抛出异常。

m0_53579703的博客 575

Spring事务和事务传播机制

Spring事务和事务传播机制

weixin_54342360的博客 1158

spring事务---传播机制

使用: @Transactional(propagation=Propagation.REQUIRED) 说明: 事务传播行为 说明 REQUIRED 当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务(默认情况) SUPPORTS 当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行 MANDATORY 该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 REQUIRES_NEW 当前方法必须运行在

Berg的学习历程 306

Spring的事务实现原理与传播机制

一、Spring的事务实现原理 (1)在要开启事务的方法上加@Transactional注解; (2)此时Spring就会使用AOP的思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后根据方法是否报错,决定回滚或者提交事务。 二、事务的传播机制 1、事务传播机制的概念,如: @Transactional(propagation = Propagation.REQUIRED) public void methodA(){ methodB(); } @Transactional(propagatio

fightee的博客 3497

这一次搞懂Spring事务是如何传播的

文章目录前言正文事务切面的调用过程事务的传播性概念实例分析总结 前言 上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodInceptor的实现类的invoke方法,而事务切面的Interceptor就是TransactionInterceptor,所以本篇直接从该类开始。 正文 事务切面的调用过程 public Object invoke(MethodInvocation invocation) throws Throwable { // Work

夜勿语的博客 1138
上一篇: 程序员面试必备的Java八股文,适合所有的Java求职者!
下一篇: 招行一面:Java的线程如何通信?
退休的汤姆
博客等级 码龄7年 1657粉丝 1051原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值