Spring Boot事务管理详解(附银行转账案例)
一、事务基础概念
事务的ACID特性:
- 原子性(Atomicity):操作要么全部成功,要么全部失败
- 一致性(Consistency):数据在事务前后保持合法状态
- 隔离性(Isolation):多个事务并发互不干扰
- 持久性(Durability):事务提交后数据永久保存
二、Spring Boot事务实战
1. 环境准备
// Maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. 实体类定义
@Entity
public class Account {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String accountNumber;private BigDecimal balance;// 省略getter/setter
}@Entity
public class TransferLog {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String fromAccount;private String toAccount;private BigDecimal amount;// 省略getter/setter
}
3. Service层事务控制
@Service
public class BankService {@Autowiredprivate AccountRepository accountRepository;@Autowiredprivate TransferLogRepository transferLogRepository;// 核心事务方法@Transactional(rollbackFor = Exception.class)public void transferMoney(String fromAccNum, String toAccNum, BigDecimal amount) {// 1. 扣减转出账户Account fromAccount = accountRepository.findByAccountNumber(fromAccNum);fromAccount.setBalance(fromAccount.getBalance().subtract(amount));accountRepository.save(fromAccount);// 模拟异常(测试事务回滚)if(amount.compareTo(BigDecimal.ZERO) < 0) {throw new RuntimeException("转账金额不能为负数");}// 2. 增加转入账户Account toAccount = accountRepository.findByAccountNumber(toAccNum);toAccount.setBalance(toAccount.getBalance().add(amount));accountRepository.save(toAccount);// 3. 记录转账日志TransferLog log = new TransferLog();log.setFromAccount(fromAccNum);log.setToAccount(toAccNum);log.setAmount(amount);transferLogRepository.save(log);}
}
三、关键注解说明
@Transactional 参数解析:
@Transactional(isolation = Isolation.DEFAULT, // 事务隔离级别propagation = Propagation.REQUIRED, // 传播行为rollbackFor = Exception.class, // 指定回滚的异常类型timeout = 30 // 事务超时时间(秒)
)
四、常见事务失效场景
- 非public方法:
@Transactional只能用于public方法 - 自调用问题:同一个类中方法A调用方法B(B有事务注解),事务不生效
- 异常被捕获:事务方法内捕获异常未重新抛出
- 错误异常类型:默认只回滚RuntimeException,需通过
rollbackFor指定
五、事务传播机制示例
// 嵌套事务示例
@Transactional(propagation = Propagation.REQUIRED)
public void parentMethod() {// 主事务逻辑childMethod(); // 嵌套子事务
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void childMethod() {// 独立事务执行// 即使外层事务回滚,此方法仍会提交
}
六、事务验证测试
@SpringBootTest
class TransactionTest {@Autowiredprivate BankService bankService;@Testvoid testTransferSuccess() {// 正常转账测试bankService.transferMoney("A123", "B456", new BigDecimal("100.00"));// 验证账户余额和日志记录}@Testvoid testTransferRollback() {// 测试异常回滚assertThrows(RuntimeException.class, () -> {bankService.transferMoney("A123", "B456", new BigDecimal("-100.00"));});// 验证数据未修改}
}
最佳实践建议:
- 事务方法尽量放在Service层
- 明确指定
rollbackFor属性 - 避免长事务(复杂操作拆分为多个小事务)
- 结合
@Transactional与数据库约束保证数据一致性
扩展学习:
- Spring官方文档:Transactions
- 分布式事务解决方案:Seata、XA协议
- 事务隔离级别深度解析(脏读/幻读/不可重复读)
相关文章:
Spring Boot事务管理详解(附银行转账案例)
一、事务基础概念 事务的ACID特性: 原子性(Atomicity):操作要么全部成功,要么全部失败一致性(Consistency):数据在事务前后保持合法状态隔离性(Isolation)&…...
【超详细教程】2025年3月最新Pytorch安装教程(同时讲解安装CPU和GPU版本)
目录 一、前言二、pytorch简介三、安装准备工作3.1、下载Anaconda 四、判断是否有NVIDIA显卡五、安装pytorch-CPU版本六、安装pytorch-GPU版本6.1、查看CUDA显卡驱动版本6.2、安装CUDA6.3、安装CuDNN(加速器)6.4、安装pytorch-GPU6.5 其他方法安装注意 七…...
Unity光线传播体积(LPV)技术实现详解
一、LPV技术概述 光线传播体积(Light Propagation Volumes)是一种实时全局光照技术,通过将场景中的间接光信息存储在3D网格中,实现动态物体的间接光照效果。 核心优势: 实时性能:相比传统光照贴图,支持动态场景 硬件…...
Git和GitCode使用(从Git安装到上传项目一条龙)
第一步 菜鸟教程-Git教程 点击上方链接,完成Git的安装,并了解Git 工作流程,知道Git 工作区、暂存区和版本库的区别 第二步 GitCode官方帮助文档-SSH 公钥管理 点击上方链接,完成SSH公钥设置 第三步(GitCode的官方引…...
通信之光纤耦合器
以下是关于光纤耦合器的详细介绍: 定义与原理 - 定义:光纤耦合器是一种能使传输中的光信号在特殊结构的耦合区发生耦合,并进行再分配的器件,也叫分歧器、连接器、适配器、光纤法兰盘。 - 原理:利用不同光纤面紧邻光纤芯…...
5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)
在5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)是关键概念之一,以下是关于它的详细介绍: 定义 DNN是5G网络中用于标识外部数据网络的名称,相当于4G中的APN(Access Point Name),两者功能等价。 组成 DNN由两部分组成: 网络ID(NI):必选,至少包…...
OpenCV、YOLO与大模型的区别与关系
OpenCV、YOLO 和大模型的区别与关系 1. OpenCV(Open Source Computer Vision Library) 定位:开源的计算机视觉基础库。功能:提供传统的图像处理算法(如图像滤波、边缘检测、特征提取)和基础工具ÿ…...
虚拟电商-话费充值业务(二)话费充值对接供应商模块开发
一、对接供应商模块开发 供应商对接模块chongba_recharge_supplier主要负责的就是调用外部的供应商系统进行充值下单,这种调用是一种基于HTTP协议的调用。 此外在供应商对接模块中主要是实现的业务逻辑有: 1:余额或押金不足情况下的失败轮…...
练习题:110
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 函数定义: 计算值的总和: 测试函数: 运行思路 结束语 Python题目 题目 定义一个函数,接受一个字典作为参数,返回字…...
c#winform,倒鸭子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果
不废话 直接上效果图 C# winform 开发抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再网上常说的倒鸭子字幕效果 主要功能 1,软件可以自定义添加字幕内容 2,软件可以添加字幕显示的时间区间 3,可以自定义字幕颜色,可以随…...
游戏被外挂攻破?金融数据遭篡改?AI反作弊系统实战方案(代码+详细步骤)
一、背景与需求分析 随着游戏行业与金融领域的数字化进程加速,作弊行为(如游戏外挂、金融数据篡改)日益复杂化。传统基于规则的防御手段已难以应对新型攻击,而AI技术通过动态行为分析、异常检测等能力,为安全领域提供了革命性解决方案。本文以游戏反作弊系统和金融数据安…...
晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包
晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包 适用型号:M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、UNT413A、M411A、E900V22C、E900V22D、IP112H等等晶晨S905L3A(B)处…...
AI来了,新手如何着手学习软件开发?
AI时代新手学习软件开发的7步进化指南 (附具体工具与避坑策略) 一、建立“人机协作”学习观 AI是教练,不是替身 正确姿势:用AI辅助理解概念(如让DeepSeek 、ChatGPT用生活案例解释递归),但坚持手…...
JDK 24 Class File API 介绍
概述 JDK 24 引入的 Class File API 提供了一套类型安全的 API 用于操作 Java 类文件。这套 API 允许我们以编程方式读取、修改和创建 Java 类文件,而不需要直接处理底层的字节码。 注1:JDK 24 已于2025年3月18日正式发布,Release信息参见官…...
C++23:现代C++的模块化革命与零成本抽象新高度
以下代码为伪代码,仅供参考 一、标准库的范式突破 1. std::expected:类型安全的错误处理 std::expected<DataPacket, ErrorCode> parsePacket(ByteStream& stream) {if (stream.header_valid()) return decode_packet(stream);elsereturn s…...
《K230 从熟悉到...》矩形检测
《K230 从熟悉到...》矩形检测 《庐山派 K230 从熟悉到...》矩形检测 矩形检测技术是一种广泛应用于电子图像处理的核心技术。它通过识别和分析图像中的矩形结构,为各种应用提供基础支持。从传统图像处理算法到现代深度学习技术,矩形检测的实现途径多种多…...
Unity 面向对象实战:掌握组件化设计与脚本通信,构建玩家敌人交互
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
3. 第三放平台部署deepseek
有时候我们会发现使用deepseek服务器,异常卡顿,这是由于多方面原因造成的,比如说访问人数过多等。想要解决这个问题,我们可以选择第三方平台进行部署 第三方平台 我们可以选择的第三方平台很多,比如硅基流动、秘塔搜索…...
【C++指针】搭建起程序与内存深度交互的桥梁(下)
🔥🔥 个人主页 点击🔥🔥 每文一诗 💪🏼 往者不可谏,来者犹可追——《论语微子篇》 译文:过去的事情已经无法挽回,未来的岁月还可以迎头赶上。 目录 C内存模型 new与…...
.NET开发基础知识1-10
1. 依赖注入(Dependency Injection) 技术知识:依赖注入是一种设计模式,它允许将对象的依赖关系从对象本身中分离出来,通过构造函数、属性或方法参数等方式注入到对象中。这样可以提高代码的可测试性、可维护性和可扩展…...
IEEE PDF Xpress校验出现 :字体无法嵌入问题以及pdf版本问题
文章目录 问题描述一、字体嵌入问题首先查看一下,哪些字体没有被嵌入查看window的font文件夹里的字体下载字体的网站修复字体嵌入问题 二、pdf版本不对 问题描述 在处理IEEE的camera ready的时候,提交到IEEE express的文件没有办法通过validate…...
cookie详解
一、cookie出现原因 http是无状态的,浏览器无法记录当前是哪个人浏览的,所以出现了cookie 作用:会话状态管理(用户登录状态、购物车、游戏分数)、个性化设置(主题、自定义设置)、浏览器行为跟…...
Mayo Clinic Platform在人工智能医疗领域的现状及启示意义研究
一、引言 1.1 研究背景与意义 在科技飞速发展的当下,人工智能(AI)已逐渐渗透至各个行业,医疗领域作为关乎人类生命健康的重要领域,也迎来了人工智能技术带来的深刻变革。人工智能医疗,作为人工智能与医疗行业深度融合的产物,正重塑着全球医疗的格局。 从全球范围来看,…...
Rust基础语法
以下是 Rust 语言基础语法的核心要点,结合与 JavaScript 的对比,帮助前端开发者快速掌握核心概念: 一、变量与常量 1. 变量声明 Rust:变量默认不可变,需用 mut 显式声明可变性。let x 5; // 不可变变量 le…...
如何将 Java 应用做成 EXE 的可执行软件
目录 前言一、情景介绍二、实现步骤1. 打 Jar 包2. 编写 bat 批处理文件3. bat 转 exe 前言 最近使用 GUI 帮朋友写了一个软件,为了方便他处理工作上的重复性且很麻烦的事情,程序是使用 Java 写的,就不得不面对一个问题:我必须将…...
第一篇:系统分析师首篇
目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复…...
自动关机监控器软件 - 您的电脑节能助手
## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具,旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动,在设定的无活动时间后自动关闭计算机,特别适合需要长时间离开电脑但…...
线程概念与控制(中)
线程概念与控制(上)https://blog.csdn.net/Small_entreprene/article/details/146464905?sharetypeblogdetail&sharerId146464905&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们经过上一篇的学习,接…...
K8S学习之基础六十二:helm部署memcached服务
helm部署memcached服务 #安装memcached的Chart docker load -i memcache_1_4_36.tar.gz #如果k8s用的是docker做容器运行时,用docker load -i导出镜像 ctr -nk8s.io images import memcache_1_4_36.tar.gz #如果k8s用的是containerd做容器运行时,用ctr…...
CPU 超线程技术以及如何关闭CPU超线程功能
CPU超线程技术介绍 CPU 超线程技术(Hyper-Threading Technology,HT)是英特尔提出的一种同时多线程(Simultaneous Multi-Threading, SMT)实现方式,其核心思想是通过逻辑层面的优化,让单个物理…...
