Spring 事务传播机制

  1.REQUIRED(默认)

        描述:如果当前存在事务,则加入该事务;如果不存在,则创建一个新的事务。
        适用场景:大多数情况下使用此选项。它是最常见的传播行为,适用于大多数业务逻辑。

 示例:

@Service
public class UserService {@Autowiredprivate OrderService orderService;@Transactional(propagation = Propagation.REQUIRED)public void createUserAndOrder() {// 创建用户createUser();// 创建订单orderService.createOrder();}private void createUser() {// 用户创建逻辑System.out.println("User created.");}
}@Service
public class OrderService {@Transactional(propagation = Propagation.REQUIRED)public void createOrder() {// 订单创建逻辑System.out.println("Order created.");}
}

解释:
        如果 createUserAndOrder 和 createOrder 都在同一个事务中调用,它们将共享同一个事务。
        如果 createOrder 抛出异常,整个事务将回滚,包括 createUser 的操作。

2. SUPPORTS

        描述:如果当前存在事务,则加入该事务;如果不存在,则以非事务方式执行。
        适用场景:当方法不需要事务支持时使用,但可以容忍在事务中运行。例如,读取数据或生成报告。
        示例: 

@Service
public class ReportingService {@Transactional(propagation = Propagation.SUPPORTS)public void generateReport() {// 生成报告逻辑System.out.println("Report generated.");}
}

解释:
        如果当前有事务,generateReport 将加入该事务。
        如果没有事务,generateReport 将以非事务方式执行。 

3. MANDATORY

        描述:如果当前存在事务,则加入该事务;如果不存在,则抛出异常。
        适用场景:确保方法必须在一个已有的事务中执行。例如,某些验证逻辑必须在事务上下文中进行。
        示例:

@Service
public class ValidationService {@Transactional(propagation = Propagation.MANDATORY)public void validateData() {// 数据验证逻辑System.out.println("Data validated.");}
}

解释:
        如果 validateData 在没有事务的情况下被调用,会抛出 IllegalTransactionStateException 异常。
        这确保了验证逻辑始终在一个事务中执行。

4. REQUIRES_NEW

        描述:创建一个新的事务,如果当前存在事务,则将当前事务挂起。
        适用场景:需要独立于外部事务的新事务,例如日志记录或发送邮件等操作。
        示例:

@Service
public class LoggingService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void logActivity(String message) {// 日志记录逻辑System.out.println("Logged: " + message);}
}

解释:
        logActivity 总是运行在一个新的独立事务中。
        即使外部事务失败,logActivity 的事务仍然可以成功提交。

5. NOT_SUPPORTED

        描述:以非事务方式执行操作,如果当前存在事务,则暂停当前事务。
        适用场景:当方法不应该参与任何事务时使用,例如读取配置文件等操作。
        示例:

@Service
public class ConfigService {@Transactional(propagation = Propagation.NOT_SUPPORTED)public void readConfig() {// 读取配置文件逻辑System.out.println("Configuration read.");}
}

解释:
        如果当前有事务,readConfig 将暂停该事务并以非事务方式执行。
        这确保了配置读取不会受到事务的影响。

6. NEVER

        描述:以非事务方式执行,如果当前存在事务,则抛出异常。
        适用场景:确保方法永远不会在一个事务中执行。例如,健康检查或监控操作。
        示例:

@Service
public class HealthCheckService {@Transactional(propagation = Propagation.NEVER)public void checkHealth() {// 健康检查逻辑System.out.println("Health check performed.");}
}

解释:
        如果 checkHealth 在事务中被调用,会抛出 IllegalTransactionStateException 异常。
        确保健康检查始终以非事务方式执行。

 7. NESTED

        描述:如果当前存在事务,则在嵌套事务内执行;如果不存在,则创建一个新的事务。嵌套事务可以独立提交或回滚。
        适用场景:需要更细粒度的事务控制,例如部分操作失败不影响其他操作。
        示例:

@Service
public class TransactionalService {@Transactional(propagation = Propagation.REQUIRED)public void performOperations() {try {// 操作1operation1();// 操作2,使用嵌套事务operation2();} catch (Exception e) {// 操作2失败,不影响操作1System.out.println("Operation2 failed, but Operation1 succeeded.");}}@Transactional(propagation = Propagation.NESTED)public void operation2() {// 模拟一个条件导致操作2失败if (true) {throw new RuntimeException("Operation2 failed.");}System.out.println("Operation2 succeeded.");}private void operation1() {// 操作1逻辑System.out.println("Operation1 succeeded.");}
}

解释:
        operation2 在 performOperations 的嵌套事务中执行。
        如果 operation2 失败,只有 operation2 的事务会被回滚,而 operation1 的事务不受影响。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行(下载) 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…

【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型 【DeepSeek论文精读】…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明,对于数据结构无非两大类结构:顺序结构、链式结构,而二叉树实质上就可以等效看作为一个二叉链表,而对于链表插入一个节点的操作是应…

深度学习01 神经网络

深度学习是机器学习领域中的一个新的研究方向。所以在学习深度学习之前我们需要了解一下神经网络。 神经网络 神经网络:是由大量的节点(或称“神经元”)和之间相互的联接构成。 每个节点代表一种特定的输出函数,称为激励函数、激活函数&…

基于JUnit4和JUnit5配合例子讲解JUnit的两种运行方式

1 引言 最近读的书有老有新,在读的过程中都完全完成了相应例子的构建和运行。在读《Spring in Action》1第4版时,其第37页的例子(以下称例子1)基于JUnit 4,并需要spring-test.jar;而在读《JUnit in Action…

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …

使用Python创建、读取和修改Word文档

自动化文档处理是提升工作效率的关键路径之一,而Python凭借其简洁语法和丰富的生态工具链,是实现文档自动化处理的理想工具。通过编程手段批量生成结构规范的合同模板、动态注入数据分析结果生成可视化报告,或是快速提取海量文档中的关键信息…

Android Studio 2024.2.2.13版本安装配置详细教程

Android Studio 是由 Google 官方开发和维护的集成开发环境(IDE),专为 Android 应用开发设计。它是基于 JetBrains 的 IntelliJ IDEA 平台构建的,集成了丰富的工具和功能,帮助开发者高效构建、调试、测试和发布 Androi…

Qt实现简易音乐播放器

使用Qt6实现简易音乐播放器,效果如下: github: Gabriel-gxb/MusicPlayer: qt6实现简易音乐播放器 一、整体架构 基于Qt框架构建 整个音乐播放器程序以Qt框架为基础进行开发。Qt提供了丰富的类库和工具,方便开发者构建图形用户界…

GPT-4使用次数有上限吗?一文了解使用规则

GPT-4的推出,让越来越多的用户开始体验其卓越的功能。无论是用于日常需求还是专业内容制作,GPT-4的应用范围广泛,获得了用户的广泛赞誉。但是,在具体使用过程中,不少用户发现自己似乎触碰到了GPT-4的使用上限&#xff…

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果,通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感,比如水的波动、反射、折射、透明等,可以让人感觉像真实的水一样流动闪耀。 核心特点就是: 动态波纹光学特…

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串(String)redis列表(List)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet / SortedSet&…

Linux之安装docker

一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客,Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本,版本号为 14.1.2.0.0 ,目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外,还增加了对 Java SE 17(J…

feign 远程调用详解

在平常的开发工作中,我们经常需要跟其他系统交互,比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么,我们应该通过什么方式进行系统之间的交互呢?今天,简单来总结下 feign 的用法。 1:引入依…

解决 npm : 无法加载文件 D:\nodeJS\node_global\npm.ps1,因为在此系统上禁止运行脚本。

问题 在我将nodeJS从18更新到22之后,我发现在黑窗口运行npm run dev,可以成功启动项目,但是在Cursor的终端中却报如下错误: PS D:\DESKTOP\项目\vue-ems-admain> npm run dev npm : 无法加载文件 D:\Users\Download\nodeJS\no…

快速对QWen2.5大模型进行微调

先看看训练结果: 目录 前言什么是LLaMA-Factory?安装LLaMA-Factory准备数据集配置微调参数运行微调脚本评估和保存模型使用微调后的模型可视化微调大模型总结 前言 在当今人工智能领域,大模型(如LLaMA、GPT等)的微调…

深入理解linux中的文件(下)

目录 一、语言级缓冲区和内核级缓冲区 二、C语音中的FILE* fp fopen(“./file.txt”,"w"): 四、理解磁盘结构: 物理结构 逻辑结构 五、未被打开的文件: 六、更加深入理解inode编号怎么找到文件: 七、对路径结构进行…

自动化测试、压力测试、持续集成

因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家,希望对需要的人有所帮助。 SoapUI 是什么? SoapUI 是一个开源测试工具,通过 soap/http 来检查、调用、实现 Web Service 的…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码,发现登不上去 过滤掉了or,,当尝试了n种方法以后,最关键的是发现()居然也被过滤了 哈哈,那玩个淡, 再搜wp!! 当输入admin的时候,提示密码错误&#xff0…