Spring 事务传播行为

news2025/4/26 5:28:28

事务传播行为(Transaction Propagation Behavior)是指多个拥有事务的方法在嵌套调用时的事务控制方式。以下是常见的事务传播行为及其应用场景:


1. PROPAGATION_REQUIRED(默认)

  • 定义:如果当前存在事务,则加入该事务;否则新建一个事务。
  • 特点
    • 最常用的传播行为。
    • 嵌套方法共享同一个事务,任一方法抛出异常都会导致整个事务回滚。
  • 示例
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        methodB(); // 调用 methodB,共享同一事务
    }
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodB() {
        // 数据库操作
    }
    

2. PROPAGATION_SUPPORTS

  • 定义:如果当前存在事务,则加入该事务;否则以非事务方式运行。
  • 特点
    • 方法不强制要求事务,可读性操作(如查询)常用。
    • 若外层有事务,则共享事务;若无事务,则独立运行。
  • 示例
    @Transactional(propagation = Propagation.SUPPORTS)
    public void queryMethod() {
        // 查询操作(可能无事务)
    }
    

3. PROPAGATION_MANDATORY

  • 定义:必须在一个已存在的事务中运行,否则抛出异常。
  • 特点
    • 强制要求调用方开启事务。
    • 适用于核心业务逻辑必须事务化的场景。
  • 示例
    @Transactional(propagation = Propagation.MANDATORY)
    public void criticalMethod() {
        // 必须在外部事务中调用
    }
    

4. PROPAGATION_REQUIRES_NEW

  • 定义:无论当前是否存在事务,都新建一个独立事务。
  • 特点
    • 内层事务与外层事务完全隔离,外层事务回滚不影响内层事务。
    • 适用于需要独立事务的场景(如日志记录)。
  • 示例
    @Transactional(propagation = Propagation.REQUIRED)
    public void outerMethod() {
        innerMethod(); // 调用 innerMethod,开启新事务
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerMethod() {
        // 独立事务
    }
    

5. PROPAGATION_NOT_SUPPORTED

  • 定义:以非事务方式运行,如果当前存在事务则挂起。
  • 特点
    • 方法不参与事务,适用于只读操作。
    • SUPPORTS 相反,强制禁用事务。
  • 示例
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void nonTransactionalMethod() {
        // 非事务操作
    }
    

6. PROPAGATION_NEVER

  • 定义:以非事务方式运行,如果当前存在事务则抛出异常。
  • 特点
    • 强制禁止事务,适用于严格禁止事务的场景。
  • 示例
    @Transactional(propagation = Propagation.NEVER)
    public void strictNonTransactionalMethod() {
        // 必须无事务调用
    }
    

7. PROPAGATION_NESTED

  • 定义:如果当前存在事务,则在嵌套事务中运行;否则新建事务。
  • 特点
    • 嵌套事务是外层事务的一部分,外层事务回滚会连带回滚嵌套事务。
    • 嵌套事务可以独立提交或回滚(依赖数据库支持,如 MySQL 的 InnoDB)。
  • 示例
    @Transactional(propagation = Propagation.REQUIRED)
    public void outerMethod() {
        innerMethod(); // 嵌套事务
    }
    
    @Transactional(propagation = Propagation.NESTED)
    public void innerMethod() {
        // 嵌套事务(可独立回滚)
    }
    

传播行为对比表

传播行为是否新建事务是否加入当前事务是否隔离典型场景
REQUIRED默认行为,大多数业务逻辑
SUPPORTS是(若存在)可选事务的查询操作
MANDATORY是(必须存在)强制事务的核心逻辑
REQUIRES_NEW独立事务(如日志记录)
NOT_SUPPORTED否(挂起当前事务)禁用事务的非关键操作
NEVER否(抛出异常)严格禁止事务的场景
NESTED是(嵌套)是(若存在)需要部分回滚的嵌套操作

最佳实践

  1. 默认使用 REQUIRED:大多数业务场景下,共享事务即可满足需求。
  2. 独立事务用 REQUIRES_NEW:需要隔离的操作(如审计日志)使用独立事务。
  3. 避免过度嵌套NESTED 需要数据库支持,滥用可能导致性能问题。
  4. 明确异常处理:通过 rollbackFornoRollbackFor 指定回滚规则。

常见错误场景

  1. 事务未生效:忘记添加 @Transactional 注解,或传播行为配置错误。
  2. 嵌套事务回滚失控:误用 REQUIRES_NEW 导致外层事务无法控制内层回滚。
  3. 事务传播与异常处理冲突:未捕获异常导致事务未按预期回滚。

通过合理选择事务传播行为,可以精确控制事务边界,确保数据一致性和系统性能。

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

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

相关文章

mfc学习(一)

mfc为微软创建的一个类qt框架的客户端程序,只不过因为微软目前有自己 的亲身儿子C#(.net),所以到2010没有进行维护。然后一些的工业企业还在继续进行维护相关的内容。我目前就接手一个现在这样的项目,其实本质与qt的思路是差不多的…

ThreadLocal详解与实战指南

目录 1. ThreadLocal基本概念 1.1 核心原理 1.2 主要特性 2. ThreadLocal API详解 2.1 核心方法 2.2 基本使用方式 3. ThreadLocal使用场景与实战 3.1 场景一:用户身份信息传递 实现步骤 1.创建用户上下文类 2.创建过滤器或拦截器来设置和清理用户信息 …

【含文档+PPT+源码】基于微信小程序的校园快递平台

项目介绍 本课程演示的是一款基于微信小程序的校园快递平台,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带…

【CODEMATE】进制转换(transform) 粤港澳青少年信息学创新大赛 C/C++/Python 解题思路

目录 问题描述做题思路,解决过程思路:踩过的坑:核心代码C 语言 / C 切片:C 语言 / C 判断 ‘A’ 数量:Python 切片:Python 判断 ‘A’ 数量: 完整代码C 语言 完整代码C 完整代码Python 完整代码…

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?

在 Java 开发的世界里,依赖管理就像是一座看不见的桥梁,连接着项目所需的各种第三方库和框架。然而,这座桥梁并非总是稳固,稍有不慎就可能掉入 “依赖地狱”,导致项目编译失败、运行异常。2025 年,随着开源…

ARM服务器与X86服务器核心区别分析

ARM服务器与X86服务器核心区别分析 一、架构设计与指令集差异 指令集本质‌ ARM‌:基于RISC(精简指令集),指令定长且简单,单周期执行效率高,硬件设计复杂度低,适合低功耗场景。 X86‌&#xf…

人口老龄化丨AI健康小屋如何实现防病于未然​

随着全球老龄化加剧,“银发浪潮” 对医疗资源、养老护理和健康管理提出了严峻挑战。 由此智绅科技应运而生,七彩喜智慧养老系统构筑居家养老安全网。 AI 健康小屋作为银发科技的创新载体,通过智能化健康监测、精准化风险预警、便捷化医疗衔…

记录搭建自己应用中心

记录搭建自己应用中心 应用架构主应用-管理中心系统文件系统子应用 日志系统日志系统前端日志系统后端 用户系统接入使用暂未完成 研发管理需求面板消息推送任务分配应用发布 应用架构 一直想做个试试,这是一个简易版的,主要是整合下知识的,…

git版本回退 | 远程仓库的回退 (附实战Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 本身暂存区有多个文件,但手快了&…

STM32 的 GPIO和中断

GPIO的简单介绍 内部结构 施密特触发器(TTL肖特基触发器) 的工作原理: 施密特触发电路(简称)是一种波形整形电路,当任何波形的信号进入电路时,输出在正、负饱和之间跳动,产生方波或…

【因果推断】(二)CV中的应用

文章目录 因果表征学习因果图 (Causal Diagram)“后门准则”(backdoor criterion)和“前门准则”(frontdoor criterion)后门调整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

分享Matlab成功安装Support Package硬件支持包的方法

分享Matlab成功安装Support Package硬件支持包的方法 文章目录 分享Matlab成功安装Support Package硬件支持包的方法一、 引言二、 操作步骤三、 附件资料四、总结 一、 引言 最近,我想学习基于Matlab simscape & Arduino实现硬件在环仿真,其中物理…

电子级甲基氯硅烷

电子级甲基氯硅烷是一类高纯度有机硅化合物,主要用于半导体制造、光伏产业及高端电子材料领域。以下从技术特性、应用场景、生产工艺、市场动态及安全规范等方面展开分析: 一、核心特性与技术标准 高纯度要求 电子级甲基氯硅烷的纯度通常需达到99.99% 以…

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度

目录 引言 一、性能优化:突破数据处理极限,提升运行效率 1.1 智能查询优化器:精准优化数据检索路径 1.2 并行处理技术:充分释放多核计算潜力 1.3 智能缓存机制:加速数据访问速度 二、稳定性提升:筑牢…

热度大幅度下降,25西电经济与管理学院(考研录取情况)

1、经济与管理学院各个方向 2、经济与管理学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、应用经济及学25年相较于24年下降25分,为325分 2、管理科学与工程25年相较于24年保持不变,为375分 3、工商管理学25年相较于24年下降5分…

DeepSeek+Mermaid:轻松实现可视化图表自动化生成(附实战演练)

目录 一、引言:AI 与图表的梦幻联动二、DeepSeek:大语言模型新星崛起2.1 DeepSeek 全面剖析2.2 多场景应用示例2.2.1 文本生成2.2.2 代码编写 三、Mermaid:代码式图表绘制专家3.1 Mermaid 基础探秘3.2 语法与图表类型详解3.2.1 流程图&#x…

今日行情明日机会——20250425

指数依然在震荡,等待方向选择,整体量能不搞但个股红多绿少。 2025年4月25日涨停板行业方向分析如下: 一、核心行业方向及驱动逻辑 一季报增长(17家涨停) 核心个股:惠而浦、鸿博股份、卫星化学驱动逻辑&am…

一道MySQL索引题

复合索引基础 MySQL中的复合索引(Composite Index)是指由多个列组成的索引。与单列索引不同、复合索引的结构更为复杂,但使用得当可以大幅提升查询性能。 复合索引的工作原理 复合索引的本质是一种有序的数据结、每个列是建立在那个索引前一列存在的情况下、那一…

【linux】设置邮件发送告警功能

当服务器内存不足或者其他故障时,可以通过自动发送故障到邮箱进行提醒。 步骤: 以qq邮箱为例: 登录qq邮箱点击设置 点击账号后,往下翻 找到POP3/IMAP...开启服务 复制授权码 安装邮箱功能 编辑/etc/s-nail.rc 验证 …

【手机】vivo手机应用声音分离方案

文章目录 前言方案 前言 尝试分离vivo手机音乐与其他应用的声音 方案 最佳方案:网易云音乐设置内关闭音量均衡 上传不同的白噪音,成功 goodlock,主要适用于三星手机,vivo不一定适用 app volume control ,可行