Spring 事务管理核心机制与传播行为应用
Spring 事务详解
一、Spring 事务简介
Spring 事务管理基于 AOP(面向切面编程)实现,通过 声明式事务(注解或 XML 配置)统一管理数据库操作,确保数据一致性。核心目标:保证多个数据库操作的原子性(要么全部成功,要么全部回滚)。
核心优势:
-
解耦业务代码与事务管理:通过注解配置,无需侵入业务逻辑。
-
支持多种事务管理器:如 JDBC、Hibernate、JPA 等。
-
灵活的事务传播行为:控制事务的边界和嵌套逻辑。

二、 案例:银行账户转账
需求:用户 A 向用户 B 转账,需保证扣款和存款操作同时成功或失败。
代码实现
(1) 业务层接口与实现类
public interface AccountService {void transfer(String fromUser, String toUser, int money);
}@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Transactional // 开启事务管理@Overridepublic void transfer(String fromUser, String toUser, int money) {// 扣款accountDao.reduceMoney(fromUser, money);// 模拟异常(事务应回滚)// int i = 1 / 0; // 存款accountDao.addMoney(toUser, money);}
}
(2) 数据层(DAO)
@Repository
public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void reduceMoney(String user, int money) {String sql = "UPDATE account SET balance = balance - ? WHERE username = ?";jdbcTemplate.update(sql, money, user);}public void addMoney(String user, int money) {String sql = "UPDATE account SET balance = balance + ? WHERE username = ?";jdbcTemplate.update(sql, money, user);}
}
三、Spring 事务核心配置
步骤 1:启用事务管理
-
Spring Boot:默认已启用事务,无需额外配置。
-
非 Spring Boot:在配置类添加
@EnableTransactionManagement。@Configuration @EnableTransactionManagement // 开启注解式事务驱动 public class AppConfig { ... }
步骤 2:配置事务管理器
-
Spring Boot:自动配置
DataSourceTransactionManager。 -
手动配置:
@Bean public PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource); }
步骤 3:使用 @Transactional 注解
-
作用位置:类(所有方法生效)或方法。
-
关键属性:
-
propagation:事务传播行为(默认REQUIRED)。 -
isolation:事务隔离级别(默认DEFAULT,跟随数据库)。 -
rollbackFor:指定触发回滚的异常类型。 -
timeout:事务超时时间(秒)。
-
四、Spring 事务角色
| 角色 | 说明 |
|---|---|
| 事务管理器 | PlatformTransactionManager 接口的实现类(如 DataSourceTransactionManager)。 |
| 事务定义 | 通过 @Transactional 注解或 XML 配置定义事务属性(传播行为、隔离级别等)。 |
| 事务状态 | 事务的运行时状态(如是否是新事务、是否回滚)。 |

五、Spring 事务属性
| 属性 | 说明 | 常用值 |
|---|---|---|
| propagation | 事务传播行为(控制事务边界) | REQUIRED(默认)、REQUIRES_NEW、NESTED、SUPPORTS 等。 |
| isolation | 事务隔离级别(解决并发问题) | DEFAULT、READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 等。 |
| timeout | 事务超时时间(秒),超时自动回滚。 | 默认 -1(无超时)。 |
| readOnly | 是否只读事务(优化数据库性能)。 | true 或 false(默认)。 |
| rollbackFor | 触发回滚的异常类型(默认仅回滚 RuntimeException)。 | 如 rollbackFor = Exception.class。 |
| noRollbackFor | 不触发回滚的异常类型。 | 如 noRollbackFor = NullPointerException.class。 |
六、 事务传播行为(Propagation)
控制事务方法之间如何相互影响,常见行为:
| 传播行为 | 说明 |
|---|---|
| REQUIRED | 如果当前存在事务,则加入该事务;否则新建一个事务(默认行为)。 |
| REQUIRES_NEW | 无论当前是否存在事务,都新建一个事务,挂起当前事务(独立提交)。 |
| SUPPORTS | 如果当前存在事务,则加入;否则以非事务方式执行。 |
| NESTED | 如果当前存在事务,则嵌套在子事务中执行(可部分回滚)。 |

七、案例:转账业务追加日志
需求:在转账操作后记录日志,且日志记录必须成功(即使转账失败也要记录)。
代码实现
@Service
public class LogService {@Autowiredprivate LogDao logDao;// 使用 REQUIRES_NEW 传播行为:独立事务@Transactional(propagation = Propagation.REQUIRES_NEW)public void addLog(String logInfo) {logDao.insertLog(logInfo);// 即使转账失败,日志也会提交}
}@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Autowiredprivate LogService logService;@Transactional@Overridepublic void transfer(String fromUser, String toUser, int money) {accountDao.reduceMoney(fromUser, money);accountDao.addMoney(toUser, money);// 记录日志(独立事务)logService.addLog("转账操作:" + fromUser + " 向 " + toUser + " 转账 " + money);}
}
关键点:
-
日志方法
addLog使用REQUIRES_NEW,确保日志事务独立提交。 -
即使转账事务回滚,日志事务仍会提交。
八、事务配置示例
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,timeout = 30,rollbackFor = {SQLException.class, IOException.class}
)
public void businessMethod() { ... }
九、 常见问题
-
事务不生效:
-
检查是否启用事务管理(
@EnableTransactionManagement)。 -
确保
@Transactional注解应用在public方法上。 -
确认异常类型是否触发回滚(默认仅回滚
RuntimeException和Error)。
-
-
事务传播行为错误:
-
嵌套事务中错误使用
REQUIRES_NEW可能导致事务过多,影响性能。
-
十、总结
-
核心注解:
@EnableTransactionManagement(启用事务)、@Transactional(定义事务属性)。 -
事务传播行为:根据业务需求选择合适的行为(如
REQUIRED或REQUIRES_NEW)。 -
事务管理本质:基于 AOP 动态代理实现,通过事务管理器控制数据库连接。
进一步实践:结合具体业务场景测试不同传播行为和隔离级别,深入理解事务的边界控制!
相关文章:
Spring 事务管理核心机制与传播行为应用
Spring 事务详解 一、Spring 事务简介 Spring 事务管理基于 AOP(面向切面编程)实现,通过 声明式事务(注解或 XML 配置)统一管理数据库操作,确保数据一致性。核心目标:保证多个数据库操作的原子…...
从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅
大家好呀!今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼,别担心!我会用最通俗易懂的方式,带你从main()方法开始,一步步揭开Spring Boot的…...
集合框架(重点)
1. 什么是集合框架 List有序插入对象,对象可重复 Set无序插入对象,对象不可重复(重复对象插入只会算一个) Map无序插入键值对象,键只唯一,值可多样 (这里的有序无序指的是下标,可…...
IPv4地址分类与常用网络地址详解
常见的 IPv4 地址分类: 1. A 类地址(Class A) 范围:0.0.0.0 到 127.255.255.255 默认子网掩码:255.0.0.0 或 /8 用途:通常用于大型网络,例如大型公司、组织。 特点: 网络地址范围…...
模拟实现memmove,memcpy,memset
目录 前言 一、模拟实现memmove 代码演示: 二、模拟实现memcpy 代码演示: 三、模拟实现memset 代码演示: 总结 前言 这篇文章主要讲解了库函数的模拟实现,包含memmove,memcpy,memset 一、模拟实现m…...
uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求
您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求。 测试步骤:1、 工作台 -打卡,申请定位权限;2、工作台-设置-编辑资料-更换头像,申请相机、存 储权限。 修改建议:APP在申请敏感权限时,应同步说明权限申…...
RHCSA Linux 系统文件内容显示2
6. 过滤文件内容显示 grep (1)功能:在指定普通文件中查找并显示含指定字符串的行,也可与管道符连用。 (2)格式:grep 选项... 关键字字符串 文件名... (3)常用选项及说…...
C语言状态字与库函数详解:概念辨析与应用实践
C语言状态字与库函数详解:概念辨析与应用实践 一、状态字与库函数的核心概念区分 在C语言系统编程中,"状态字"和"库函数"是两个经常被混淆但本质完全不同的概念,理解它们的区别是掌握系统编程的基础。 1. 状态字&…...
【2】Kubernetes 架构总览
Kubernetes 架构总览 主节点与工作节点 主节点 Kubernetes 的主节点(Master)是组成集群控制平面的关键部分,负责整个集群的调度、状态管理和决策。控制平面由多个核心组件构成,包括: kube-apiserver:集…...
Redis下载
目录 安装包 1、使用.msi方式安装 2.使用zip方式安装【推荐方式】 添加环境变量 配置后台运行 启动: 1.startup.cmd的文件 2.cmd窗口运行 3.linux源码安装 (1)准备安装环境 (2)上传安装文件 (3&…...
React 文章 分页
删除功能 携带路由参数跳转到新的路由项 const navigate useNavigate() 根据文章ID条件渲染...
OpenCV 图形API(39)图像滤波----同时计算图像在 X 和 Y 方向上的一阶导数函数SobelXY()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::gapi::SobelXY 函数是 OpenCV 的 G-API 模块中用于同时计算图像在 X 和 Y 方向上的一阶导数(即 Sobel 边缘检测)的一…...
传导发射测试(CE)和传导骚扰抗扰度测试(CS)
传导发射测试(CE): 测量接收机: 是EMI测试中最常用的基本测试仪器,仪器类型包括准峰值测量接收机、峰值测量接收机、平均值测量接收机和均方根值测量接收机。测量接收机的几个重要指标分别是:6dB处的带宽、充电时间常数、放电时…...
ubuntu 查看现在服务使用的端口
1. 使用netstat命令 netstat是一个常用的网络工具,可以显示网络连接、路由表、接口统计等信息。虽然在较新的系统中netstat可能被ss命令替代,但仍然可以通过安装net-tools包来使用它。 安装net-tools: sudo apt-get install net-tools 查看…...
即插即用模块(1) -MAFM特征融合
(即插即用模块-特征处理部分) 一、(2024) MAFM&MCM 特征融合特征解码 paper:MAGNet: Multi-scale Awareness and Global fusion Network for RGB-D salient object detection 1. 多尺度感知融合模块 (MAFM) 多尺度感知融合模块 (MAFM) 旨在高效融合 RGB 和深度…...
(学习总结34)Linux 库制作与原理
Linux 库制作与原理 库的概念静态库操作归档文件命令 ar静态库制作静态库使用 动态库动态库制作动态库使用与运行搜索路径问题解决方案方案2:建立同名软链接方案3:使用环境变量 LD_LIBRARY_PATH方案4:ldconfig 方案 使用外部库目标文件ELF 文…...
DSP28335入门学习——第一节:工程项目创建
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.20 DSP28335开发板学习——第一节:工程项目创建 前言开发板说明引用解答…...
MDG 实现后端主数据变更后快照自动刷新的相关设置
文章目录 前言实现过程BGRFC期初配置(可选)设置 MDG快照 BGRFC维护BP出站功能模块 监控 前言 众所周知,在MDG变更请求创建的同时,所有reuse模型实体对应的快照snapshot数据都会记录下来。随后在CR中,用户可以修改这些…...
基于瑞芯微RK3562 的四核 AR M Cortex-A53 + 单核 ARM Cortex-M0——MQTT通信方案
前 言 本文主要介绍创龙科技TL3562-MiniEVM评估板基于MQTT通信协议的开发案例,适用开发...
Java 实体类链式操作
目录 1. 使用返回 this 的 setter 方法 2. 使用 Lombok 的 Accessors 注解 3. 建造者模式 (Builder Pattern) 比较 链式设置参数(也称为链式调用或方法链)是一种编程风格,可以让代码更加简洁易读。在 Java 实体类中实现链式设置参数通常有…...
【Linux】Linux 操作系统 - 05 , 软件包管理器和 vim 编辑器的使用 !
文章目录 前言一、软件包管理器1 . 软件安装2 . 包管理器3 . Linux 生态 二、软件安装 、卸载三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替换模式7 . V-BLOCK 模式8 . 技巧补充 总结 前言 本篇笔者将会对软件包管理…...
【操作系统原理05】存储器管理
大纲 文章目录 大纲一. 内存基础知识0.大纲1.什么是内存2.进程运行基本原理2.1 指令工作原理2.2逻辑地址VS物理地址2.3 从写程序到程序运行完整运行三种链接方式 二.内存管理0.大纲1.操作系统进行内存管理 三.覆盖与交换0.大纲1.覆盖技术2.交换技术 四.连续分配管理方式0.大纲1…...
学习笔记—C++—string(练习题)
练习题 仅仅反转字母 917. 仅仅反转字母 - 力扣(LeetCode) 题目 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。 返回反转后的 s 。…...
[Swift]Xcode模拟器无法请求http接口问题
1.以前偷懒一直是这样设置 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/><key>NSAllowsArbitraryLoadsInWebContent</key><true/> </dict> 现在我在Xcode16.3上ÿ…...
返回之术:用 navigate(-1) 闯荡前端江湖
前言 在前端这片江湖,页面跳转宛如轻功水上漂,来去无踪,飘忽不定。但其中有一门绝学,专治“回头是岸”之需求,那便是 React Router 中的 navigate(-1) 身法。 昔日我闯荡项目林,误入“下一页”禁地,一脚踏空,身陷页面迷阵。正当我焦头烂额之际,师父袖袍一挥,口吐一…...
《Operating System Concepts》阅读笔记:p748-p748
《Operating System Concepts》学习第 64 天,p748-p748 总结,总计 1 页。 一、技术总结 1.Transmission Control Protocol(TCP) 重点是要自己能画出其过程,这里就不赘述了。 二、英语总结(生词:3) transfer, transport, tran…...
基于深度学习的线性预测:创新应用与挑战
一、引言 1.1 研究背景 深度学习作为人工智能领域的重要分支,近年来在各个领域都取得了显著的进展。在线性预测领域,深度学习也逐渐兴起并展现出强大的潜力。传统的线性预测方法在处理复杂数据和动态变化的情况时往往存在一定的局限性。而深度学习凭借…...
网络编程3
day3 一、服务器模型 1.循环服务器模型 同一个时刻只能响应一个客户端的请求 2.并发服务器模型 2.1含义 同一个时刻可以响应多个客户端的请求,常用的模型有多进程模型/多线程模型/IO多路复用模型。 2.2多进程模型 每来一个客户端连接,开一个子进程来专门…...
数字化时代下的工业物联网智能体开发平台策略
1. 引言 1.1 工业物联网智能体的发展背景 随着工业4.0的兴起和数字化转型的不断深入,工业物联网(IIoT)已成为推动制造业创新发展的关键技术之一。智能体作为工业物联网的核心组成部分,其开发平台的建设与应用对于实现智能化升级、提升生产效率、降低…...
[Java实战经验]异常处理最佳实践
一些好的异常处理实践。 目录 异常设计自定义异常为异常设计错误代码(状态码)设计粒度全局异常处理异常日志信息保留 异常处理时机资源管理try-with-resources异常中的事务 异常设计 自定义异常 自定义异常设计,如业务异常定义BusinessExce…...
