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_NEWNESTEDSUPPORTS 等。
isolation事务隔离级别(解决并发问题)DEFAULTREAD_COMMITTEDREAD_UNCOMMITTEDREPEATABLE_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() { ... }

九、 常见问题

  1. 事务不生效

    • 检查是否启用事务管理(@EnableTransactionManagement)。

    • 确保 @Transactional 注解应用在 public 方法上。

    • 确认异常类型是否触发回滚(默认仅回滚 RuntimeException 和 Error)。

  2. 事务传播行为错误

    • 嵌套事务中错误使用 REQUIRES_NEW 可能导致事务过多,影响性能。


十、总结

  • 核心注解@EnableTransactionManagement(启用事务)、@Transactional(定义事务属性)。

  • 事务传播行为:根据业务需求选择合适的行为(如 REQUIRED 或 REQUIRES_NEW)。

  • 事务管理本质:基于 AOP 动态代理实现,通过事务管理器控制数据库连接。

进一步实践:结合具体业务场景测试不同传播行为和隔离级别,深入理解事务的边界控制!

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

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

相关文章

JavaScript解密实战指南:从基础到进阶技巧

JavaScript加密技术广泛应用于数据保护、反爬虫和代码混淆,但掌握解密方法能帮助开发者突破技术壁垒。本文结合爬虫实战与安全分析场景,系统梳理JS解密的核心方法与工具。 一、基础解密方法 1. Base64解码 适用于简单编码场景,如Cookie加密…

WEMOS LOLIN32

ESP32是結合Wi-Fi和藍牙的32位元系統單晶片(SoC)與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板,最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…

俄罗斯方块-简单开发版

一、需求分析 实现了一个经典的俄罗斯方块小游戏,主要满足以下需求: 1.图形界面 使用 pygame 库创建一个可视化的游戏窗口,展示游戏的各种元素,如游戏区域、方块、分数等信息。 2.游戏逻辑 实现方块的生成、移动、旋转、下落和锁…

使用安全继电器的急停电路设计

使用安全继电器的急停电路设计 一,急停回路的设计1,如何将急停接到线路当中?2,急停开关 如何接到安全继电器中 一,急停回路的设计 急停是每一个设备必不可少的部分,因为关乎安全,所以说所以说他…

【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析

低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩,单颗芯片可集成更多元件,导致功耗相应增长。更严峻的是,现代芯片工作频率较二十年前大幅提升,而功耗与频率呈正比关系。因此,芯片功耗突破…

在 Debian 10.x 安装和配置 Samba

1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …

修改PointLIO项目

添加key_frame_info.msg消息 新建.msg文件,内容填写为: # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…

关于隔离1

1.隔离的目的: 在隔离电源设计中,输入与输出之间没有直接电气连接,提供绝缘高阻态,防止电流回路。这意味着输入与输出之间呈现为绝缘的高阻态,从而确保了无电流回路的形成。 隔离与可靠保护有关。电隔离是一种电路设…

【java实现+4种变体完整例子】排序算法中【插入排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是插入排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、插入排序基础实现 原理 将元素逐个插入到已排序序列的合适位置,逐步构建有序序列。 代码示例 public class InsertionSort {void…

清醒思考的艺术

成为穿越暴风雨后的幸存者 系统性错误是指系统性的偏离理性,偏离最理想的、合乎逻辑的、理智的思考和行为。 “系统”一词很重要,因为我们经常错误地走向同一方向。 幸存偏误 幸存偏误会扭曲概率,系统性的高估了成功概率。一旦混淆选择标准和…

DSA数据结构与算法 6

查找技术(Searching Techniques) 查找简介 在计算机科学中,“查找”指的是在某个集合或序列中寻找特定元素的过程。这个过程可以是成功的,也可以是失败的: 若目标元素存在于集合中,我们称之为“查找成功”…

FastAPI:现代高性能Python Web框架的技术解析与实践指南

一、FastAPI的诞生背景与技术定位 在数字化转型的浪潮中,API(应用程序接口)作为连接服务与数据的核心枢纽,其性能与开发效率直接影响业务迭代速度。传统Python框架如Django和Flask虽功能丰富,但在高并发场景下面临性能瓶颈,且缺乏对异步编程的原生支持。FastAPI应运而生…

VuePress 使用教程:从入门到精通

VuePress 使用教程:从入门到精通 VuePress 是一个以 Vue 驱动的静态网站生成器,它为技术文档和技术博客的编写提供了优雅而高效的解决方案。无论你是个人开发者、团队负责人还是开源项目维护者,VuePress 都能帮助你轻松地创建和管理你的文档…

1.Vue自动化工具安装(Vue-cli)

目录 1.node.js 安装: 2 npm 安装 3 安装Vue-cli 4总结: 一般情况下,单文件组件,我们运行在 自动化工具vue-CLI中,可以帮我们编译单文件组件。所以我们在学习时一般需要在系统中先搭建vue-CLI工具 下面就是一些我…

IP数据报

IP数据报组成 IP数据报(IP Datagram)是网络中传输数据的基本单位。 IP数据报头部 版本(Version) 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”,IPv6版本是“6”。 头部长度(IHL,Intern…

Leetcode 2158. 每天绘制新区域的数量【Plus题】

1.题目基本信息 1.1.题目描述 有一幅细长的画,可以用数轴来表示。 给你一个长度为 n 、下标从 0 开始的二维整数数组 paint ,其中 paint[i] [starti, endi] 表示在第 i 天你需要绘制 starti 和 endi 之间的区域。 多次绘制同一区域会导致不均匀&…

Git Flow

Git Flow深度解析:企业级分支管理实战指南 前言 在持续交付时代,分支策略决定团队协作效率。Git Flow作为经典的分支管理模型,被Apache、Spring等知名项目采用。2023年JetBrains开发者调查报告显示,Git Flow仍是中大型项目最常用…

[Swift]pod install成功后运行项目报错问题error: Sandbox: bash(84760) deny(1)

操作: platform :ios, 14.0target ZKMKAPP do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!# Pods for ZKMKAPPpod Moyaend pod install成功后运行报错 报错: error: Sandbox: bash(84760) deny(1) file-writ…

[管理与领导-129]:向上管理-组织架构、股权架构、业务架构、流程架构,看每个人在组织中的位置和重要性

目录 一、股权架构:反映所有权与控制权 二、组织架构:定义角色与汇报关系 三、业务架构:定义业务单元与价值链 四、流程架构:规范业务运作与协作 五、综合分析:个人在组织中的综合影响力 六、案例:某…

小红书爬虫,小红书api,小红书数据挖掘

背景: 小红书(Xiaohongshu)是一款结合社交、购物和内容分享的移动应用,近年来在中国以及全球范围内拥有大量的用户群体。小红书上的内容包括用户的消费体验、生活方式、旅行分享、时尚搭配等。通过这些内容,用户可以了…