详细解释Spring事务的传播机制

news2024/11/15 23:17:55

详细解释Spring事务的传播机制

Spring框架中,事务传播机制是指在一个事务方法调用另一个事务方法时,Spring如何管理这些方法之间的事务边界。Spring提供了七种事务传播行为,以满足不同的业务需求。下面将详细解释每种传播行为及其适用场景,并探讨在特定情况下事务的行为。

1. PROPAGATION_REQUIRED

这是最常用的事务传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这种行为确保所有事务操作都在一个统一的事务上下文中执行。

适用场景:大多数情况下使用此传播行为,确保多个事务操作在同一个事务中执行,以保持数据一致性。

什么情况下当前会没有事务?当前是指什么?

在讨论Spring事务传播行为时,“当前”指的是方法执行的上下文,即方法被调用的时刻。当前是否存在事务取决于调用链上的事务配置和执行状态。以下是一些常见情况下当前没有事务的情形:

  1. 外层方法没有事务管理:如果调用事务方法的外层方法没有被事务注解(如@Transactional)标记,那么在调用事务方法时,当前就没有事务存在。

  2. 事务已经提交或回滚:如果前一个事务操作已经完成(提交或回滚),当前就没有活跃的事务。

  3. 非事务调用:从非事务管理的代码路径调用事务方法。例如,从普通的Java方法或第三方库代码中调用事务方法。

  4. 不支持事务的方法:有些方法或组件不支持事务管理,在这些方法中调用事务方法时,当前没有事务。

举例说明

假设有两个方法 methodAmethodB,其中 methodB 被标记为 @Transactional

public class MyService {
    
    public void methodA() {
        // methodA没有事务管理
        methodB();
    }

    @Transactional
    public void methodB() {
        // methodB有事务管理
        // 执行数据库操作
    }
}

在这种情况下,调用 methodA 时:

  • methodA 没有事务管理,因此当前没有事务。
  • methodA 调用 methodB 时,由于 methodA 没有事务,所以 methodB 会创建一个新的事务。

如果将 methodA 也标记为 @Transactional

@Transactional
public void methodA() {
    methodB();
}

此时,调用 methodA 时:

  • methodA 开启了一个事务,因此当前有事务。
  • methodA 调用 methodB 时,methodB 会加入 methodA 的事务,而不是创建新的事务。

如果methodA没有事务,调用了有事务的methodB,那么methodB执行之后的部分,也在事务当中吗?

如果 methodA 没有事务,而调用了有事务的 methodB,那么 methodB 执行之后的部分,不会在事务当中。具体来说,事务的范围仅限于 methodB 的执行过程,methodB 方法返回后,事务就会结束。

下面通过一个具体的例子来说明这个过程:

假设有以下两个方法:

public class MyService {
    
    public void methodA() {
        // 非事务代码
        methodB(); // 调用有事务管理的方法
        // 继续执行非事务代码
    }

    @Transactional
    public void methodB() {
        // 有事务管理的代码
        // 执行数据库操作
    }
}

调用 methodA 时的事务行为如下:

  1. methodA 开始执行,此时没有事务。
  2. methodA 调用 methodB,由于 methodB 被标记为 @Transactional,Spring 会为 methodB 创建一个新的事务。
  3. methodB 在事务中执行其代码(如数据库操作)。
  4. methodB 执行完成后,事务提交或回滚(取决于方法执行的结果和异常情况)。
  5. methodB 返回到 methodA,此时事务已经结束。
  6. methodA 继续执行剩余代码,但此时已经没有事务。

所以,在 methodA 中,methodB 执行的部分是在事务中的,但 methodB 返回后,methodA 剩余的代码是不在事务中的。事务边界由 methodB 的开始和结束决定,事务结束后事务上下文不再存在。

举例:

public class MyService {
    
    public void methodA() {
        System.out.println("methodA: start");
        methodB();
        System.out.println("methodA: end");
    }

    @Transactional
    public void methodB() {
        System.out.println("methodB: in transaction");
        // 这里执行一些数据库操作
    }
}

运行结果:

methodA: start
methodB: in transaction
methodA: end

在这个示例中:

  • “methodA: start” 和 “methodA: end” 的打印是在没有事务的情况下进行的。
  • “methodB: in transaction” 的打印和数据库操作是在事务中的。

这样可以看出,methodB 的事务边界不影响 methodA 的事务状态。

2. PROPAGATION_REQUIRES_NEW

总是启动一个新的事务。如果当前存在事务,则将当前事务挂起。在新的事务执行完成后,恢复先前的事务。

适用场景:适用于需要独立事务的情况,例如记录日志或审计信息,不希望这些操作受到主事务的影响。

3. PROPAGATION_SUPPORTS

支持当前事务。如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

适用场景:适用于既能在事务内执行,也能在事务外执行的操作。比如,某些只读操作或性能要求不高的操作。

4. PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作。如果当前存在事务,则将当前事务挂起。

适用场景:适用于不需要事务支持的操作,或某些性能要求高、不希望受到事务管理开销影响的操作。

5. PROPAGATION_NEVER

以非事务方式执行。如果当前存在事务,则抛出异常。

适用场景:适用于明确不希望在事务中执行的操作。比如,某些数据库操作可能不支持事务。

6. PROPAGATION_MANDATORY

支持当前事务。如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

适用场景:适用于必须在现有事务中执行的操作。通常用于一些关键业务逻辑,要求调用者必须在事务中运行。

7. PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则创建一个新的事务。嵌套事务依赖于底层数据库对保存点(savepoint)的支持。

适用场景:适用于需要部分提交或回滚的复杂业务操作。比如,复杂的财务操作,某些步骤失败后需要回滚到特定点。

参考链接

  • Spring事务管理官方文档
  • Spring事务传播行为解释

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1868628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不用翻墙,手把手教你用MAC本地版免费ComfyUI搭建Stable Diffusion工作流,让出图效率起飞

AI绘图如火如荼发展了这么久,从mj到SD webUI,再到时下最热门的Comfy UI。因为显存的问题对Mac用户一直不是很友好,阻碍了大部分设计师上手学习的道路。但是Comflowy解决了这个痛点。这是一款Mac系统可用本地版的sd,一键安装,让苹果…

阿里巴巴找黄金宝箱(IV)

系列文章目录 本人最近再练习算法,所以会发布自己的解题思路,希望大家多指教 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 一、题目描述 贫如洗的椎夫阿里巴巴在去砍柴的路上,无意中发现…

基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还…

操纵系统的特征调度算法

操纵系统的特征 调度算法是操作系统用来决定各个进程/作业在CPU上执行顺序的方法。最常见的调度算法有:FCFS、SJF、HRRN、RR、HPF和MFQ。这集先介绍前三个 先来先服务 FCFS 根据作业到达的先后顺序调度,CPU会一直运行直到作业结束,所以这个…

跌幅高达10.2分!32本Top,Elsevier旗下在检SSCI期刊(2024年6月影响因子更新版)

本周投稿推荐 SSCI • 1区,4.0-5.0(无需返修,提交可录) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.1-0.5&…

AJAX进阶-day4

目录 同步代码和异步代码 回调函数地狱 Promise - 链式调用 async函数和await async函数和await_捕获错误 事件循环-EventLoop 宏任务与微任务 Promise.all 静态方法 同步代码和异步代码 同步代码: 逐行 执行,需 原地等待 结果 后,才…

界面控件Telerik UI for Winforms 2024 Q2新版亮点 - 发布全新的AI相关组件

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件,所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for Winform…

超声波清洗机洗眼镜效果好吗?四大主流超声波清洗机终极大测评

清洗眼镜是日常生活中一件很麻烦的事情,常规的清洗方式无法完全清洁镜片上的细菌和污垢,而且容易造成划痕。也有很多朋友为了节省时间,每次清洗眼镜都用衣服衣角随便擦拭擦拭就完事了,但其实这样做往往会很伤眼镜,缩短…

域名 Whois 检测:企业网络安全与品牌保护的利器

域名是企业在互联网上的重要标识,其安全性和合规性直接影响着企业的业务运营和品牌声誉。而域名 Whois 检测通过全面分析和监控域名的 Whois 信息,为企业提供了多方面的保障,帮助企业识别潜在的网络威胁、保护品牌资产、优化域名管理。 那么什…

Shopee API接口——获取商家店铺商品列表

一、引言 在跨境电商领域,Shopee作为东南亚地区领先的电商平台,为众多商家提供了广阔的市场和丰富的销售机会。本文将详细介绍如何通过Shopee API获取商家店铺商品列表,并探讨其应用场景。 二、核心功能介绍 Shopee API获取商家店铺商品列…

netmiko_ssh_华为防火墙

from netmiko import ConnectHandlerip 防火墙ip地址hw_fw {device_type: huawei,host: ip, # 使用 host 字段同时指定 IP 和端口号username: 用户名,password: 密码,port: 50022 # 直接设置 port 字段 }net_connect ConnectHandler(**hw_fw)ou net_connect.send_command…

数据恢复篇:如何在Android上恢复删除的短信

如果您不小心删除了Android设备上的短信并想要检索它们,则可以尝试以下方法: 如何在Android上恢复删除的短信 检查您的备份: 如果您之前备份了Android设备,则可以从备份中恢复已删除的短信。检查您设备的内部存储空间或 Google 云…

科普小课堂|不同版本USB接口详细解析

USB接口凭借其广泛的兼容性和高性能,已成为连接多样外设的主要接口,囊括了日常的键盘、鼠标等输入设备以及其他更多的领域。不仅如此,USB还展现了高度灵活性,能够便捷地转换为其他总线接口,例如实现USB到以太网或USB到…

降低IT运营成本,提升客户体验 |LinkSLA亮相第十届CDIE

6月25-26日,中国数字化创新博览会(CDIE 2024)在上海张江科学会堂举行。本届展览主题为“AI创新,引领商业增长新格局”,旨在交流企业在数字化时代,如何以科技为驱动,在转型中如何把握机遇&#x…

用Verilog实现4位计数器(时序逻辑)

用Verilog实现4位计数器。(时序逻辑) 实验目的: 通过用Verilog实现4位计数器,进一步熟悉Verilog的语法和时序逻辑电路。 实验描述: 输入: Clock:如果计数器enable信号为1,那么在…

科研所文件数据很关键,外发图纸如何控制?

图纸是科研所整个科研周期中最重要的资料类型之一。这些图纸主要用于描述和记录研究过程中的各种设计、实验装置、设备或产品原型等。 首先,科研所在进行新技术、新产品或新方法的研发时,通常需要进行详细的设计和规划。在这个过程中,科研人员…

07 Pytoch Module

1.继承nn.Module 2.class A (B) 进入到 super_init() 3.进入construct() 初始化参数 同时判断是否为train 4.跳出来:进入了 forward 中 5.子模块的构建 nn.Module总结 一个module可以包含多个子module 一个module相当于一个运算,必须实现…

算法基础详解

大O记法 为了统一描述,大O不关注算法所用的时间,只关注其所用的步数。 比如数组不论多大,读取都只需1步。用大O记法来表示,就是:O(1)很多人将其读作“大O1”,也有些人读成“1数量级”。一般读成“O1”。虽…

Recuva v1.53 解锁版使用步骤 (免费的文件恢复工具)

前言 Recuva中文版是一款免费的文件恢复工具,可以用来恢复误删除的文件,能直接恢复硬盘数据,U盘文件等,Recuva数据恢复软件小巧实用,扫描速度非常快,只要没有被重复写入数据,无论格式化还是删除均可以直接恢复。 一、下载地址 下载链接:http://dygod/source 点击…

彩色动态3D相机

彩色动态3D相机 透明、 半透明和有光泽物体的3D扫描 在物流、汽车和制药领域实现新的自动化 清晰和完整的扫描 新的3D扫描方法可以显著改善信号读出 透明、半透明和有光泽的对象,以提供更高的完整性和质量 的 3D 即使不需要使用涂层和扫描喷雾,也可以…