Spring : 事务管理

在这里插入图片描述

1. 基本概念

事务(Transaction)是一组不可分割的操作单元,这些操作要么全部成功执行,要么全部失败回滚,不存在部分成功的情况。
事务具有ACID特性:

  • 原子性(Atomicity):事务是不可分割的最小单元。
  • 一致性(Consistency):事务执行前后,数据状态保持合法(如转账后总金额不变)。
  • 隔离性(Isolation):多个事务并发执行时,彼此互不干扰。
  • 持久性(Durability):事务提交后,数据变更永久保存。

2.核心接口

Spring通过抽象层封装了不同的事务管理方式(如JDBC、Hibernate、MyBatis等),核心接口包括:

接口作用
PlatformTransactionManager事务管理器接口,定义了事务的提交、回滚等操作。
TransactionDefinition定义事务属性(隔离级别、传播行为、超时时间等)。
TransactionStatus表示事务的当前状态(是否活跃、是否已提交等)。

常见实现类

  • DataSourceTransactionManager:用于JDBC或MyBatis的事务管理。
  • HibernateTransactionManager:用于Hibernate的事务管理。

3. 方式

声明式事务管理

通过注解或XML配置声明事务规则,无需手动编写事务控制代码,侵入性低,是实际开发的首选。

核心注解:@Transactional
可标注在类或方法上,用于声明该类/方法需要事务管理。

示例:

@Service
public class UserService {// 声明式事务:方法执行时自动开启事务@Transactionalpublic void transferMoney() {// 业务逻辑:扣减A的余额,增加B的余额updateUserA();updateUserB();// 若方法正常结束,自动提交事务;若抛出异常,自动回滚}
}

4. @Transactional注解的核心属性

@Transactional提供了丰富的属性来配置事务行为:

属性作用可选值示例
propagation事务传播行为(解决嵌套事务问题)REQUIRED(默认)、REQUIRES_NEW
isolation事务隔离级别(解决并发问题)READ_COMMITTED(默认)、SERIALIZABLE
readOnly是否为只读事务(查询操作可优化性能)true/false(默认false)
timeout事务超时时间(秒),超时自动回滚30(30秒)
rollbackFor指定触发回滚的异常类型Exception.class
noRollbackFor指定不触发回滚的异常类型BusinessException.class

关键属性详解

  1. 事务传播行为(propagation
    定义了多个事务方法嵌套调用时,事务如何传播。常见场景:

    • REQUIRED(默认):如果当前有事务,则加入;否则新建事务。
    • REQUIRES_NEW:无论当前是否有事务,都新建一个事务(原事务暂停)。
    • SUPPORTS:如果当前有事务,则加入;否则以非事务方式执行。

    示例:

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logOperation() {// 日志记录,独立事务,即使主事务回滚也会提交
    }
    
  2. 事务隔离级别(isolation
    解决并发事务引发的问题(脏读、不可重复读、幻读):

    • READ_UNCOMMITTED:最低级别,允许读取未提交的数据(可能脏读)。
    • READ_COMMITTED(默认):只能读取已提交的数据(避免脏读)。
    • REPEATABLE_READ:保证多次读取同一数据结果一致(避免不可重复读)。
    • SERIALIZABLE:最高级别,完全串行化执行(避免所有并发问题,但性能低)。

5. 事务回滚规则

  • 默认情况下,@Transactional仅对未检查异常(RuntimeException及其子类) 触发回滚,对已检查异常(如IOException 不回滚。
  • 可通过rollbackFor = Exception.class指定对所有异常回滚:
    @Transactional(rollbackFor = Exception.class)
    public void transferMoney() throws Exception {// 任何异常都会触发回滚
    }
    

6.实现原理

Spring声明式事务基于AOP(面向切面编程) 实现:

  1. 当方法标注@Transactional时,Spring通过AOP动态生成代理对象。
  2. 代理对象在方法执行前开启事务,执行后根据是否异常决定提交或回滚。
  3. 事务管理逻辑与业务逻辑解耦,通过"环绕通知"织入。

7. 常见问题与注意事项

  1. @Transactional失效场景

    • 方法被privatefinal修饰(AOP无法生成代理)。
    • 同类中非事务方法调用事务方法(未经过代理对象)。
    • 异常被try-catch捕获但未重新抛出(Spring无法感知异常)。
    • 数据库引擎不支持事务(如MySQL的MyISAM,需改用InnoDB)。
  2. 自调用问题
    同类中方法A调用方法B(标注@Transactional),事务会失效,因为未通过代理对象调用。
    解决:注入自身Bean或使用AopContext.currentProxy()获取代理对象。

  3. 性能优化

    • 查询操作设置readOnly = true(数据库可优化)。
    • 避免事务范围过大(如将非数据库操作移出事务)。

总结

Spring事务管理简化了传统JDBC事务的复杂性,声明式事务(@Transactional)因其低侵入性成为主流选择。实际开发中需注意事务的传播行为、隔离级别及失效场景,确保数据一致性的同时兼顾性能。

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

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

相关文章

C# 一个投资跟踪程序的设计与实现:面向对象与设计模式的深度解析

在现代金融应用开发中,如何高效、灵活地构建投资跟踪系统,是每一个金融软件工程师必须面对的挑战。本文将围绕一个投资跟踪程序的设计与实现过程,深入剖析其背后的设计理念、架构模式以及具体实现细节。我们将通过面向对象编程、设计模式&…

存储的未来之战:RustFS如何用ZK框架重构分布式协调?

本篇文章目录 一、导火索:当数据洪峰撞上分布式协调的天花板 二、技术密码:ZK框架的三大重构 2.1 一致性哈希环的量子级进化 2.2 动态负载均衡的"神经反射" 2.3 跨云数据同步的"时空折叠" 三、未来战争:2026年存储…

模拟实现STL中的list容器

list前言一、list的节点结构设计二、迭代器设计三、list类的实现3.1 类的成员变量和类型定义3.2 构造函数与析构函数3.3 元素访问与迭代器接口3.4 插入与删除操作3.5 其他常用操作四、总结每文推荐前言 在C STL中,list是一个非常常用的容器,它基于双向循…

Debug-039-el-date-picker组件手动输入时间日期的问题处理

图1-外输入框图2-内输入框图3问题描述:这两天在迭代功能的时候,基本上碰到的问题都是出自这个“时间日期选择框”,昨天的bug38也是解决这个组件。如上图1和2所示,可以把图1中的输入框叫外输入框,图2中的输入框叫内输入…

docker-runc not installed on system

问题 Docker build时Dockerfile有RUN命令执行报错shim error: docker-runc not installed on system,如下:解决方法 修改/etc/docker/daemon.json,添加正面内容 {"runtimes": {"docker-runc": {"path": "…

【秋招笔试】2025.08.27华为秋招研发岗真题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 题目一:智能温控系统监测 1️⃣:使用滑动窗口技术维护有效温度区间 2️⃣:利用单调队列高效维护窗口内的最大值和最小值 3️⃣:动态调整窗口边界,确保满足温…

Kafka 消费模型

文章目录1. 一个消费者组中只有 1 个消费者2. 一个消费者组中有 2 个消费者3. 消费者数量 > 分区数量4. 多个消费者读取同一个分区5. 消费者放入消费者组5.1 何时放入同一个消费者组5.2 何时放入不同的消费者组1. 一个消费者组中只有 1 个消费者 假设我们有一个 TopicT1&am…

【路由器】TP Link 路由器为何无法进入管理后台

TL-WR710N是TP Link在很多年前发布的一个迷你型的便携路由器,一插上还能用,直接reset打算重设密码,结果根据它给的192.168.1.253根本打不开。# 解决方法ping一下192.168.1.253,无法连接。这个问题本质上是 你电脑/手机的 IP 和路由…

LightGBM(Light Gradient Boosting Machine,轻量级梯度提升机)梳理总结

LGB微软团队在 2017 年提出的梯度提升树模型,核心定位是 “更高效的 XGBoost”—— 它在保持精度接近 XGBoost 的同时,通过“数据采样优化”“特征压缩”“树生长策略改进”三大创新,将训练速度提升 10-100 倍,内存消耗降低数倍&a…

毕业项目推荐:29-基于yolov8/yolov5/yolo11的光伏板检测识别系统(Python+卷积神经网络)

文章目录 项目介绍大全(可点击查看,不定时更新中)概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式…

【实时Linux实战系列】实时数据可视化技术实现

在当今数据驱动的世界中,实时数据可视化已成为理解和利用实时信息的关键工具。无论是在金融交易监控、工业生产监控、智能交通管理还是物联网设备监控中,能够将复杂的数据以直观的图表形式展示出来,对于快速决策和问题解决至关重要。实时数据…

【LeetCode每日一题】21. 合并两个有序链表 2. 两数相加

每日一题21. 合并两个有序链表题目总体思路算法步骤时间复杂度与空间复杂度代码2. 两数相加题目总体思路算法步骤时间复杂度与空间复杂度代码知识感悟2025.8.3021. 合并两个有序链表 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所…

DVWA靶场通关笔记-文件包含(Impossible级别)

目录 一、源码分析 二、文件包含防范分析 1、明确指定允许包含的文件 2、拒绝所有未在白名单中的输入 3、总结 (1)白名单 (Allow List) (2)硬编码/映射 (Hardcoding/Mapping) (3)输入过滤 (Input F…

构建坚不可摧的数据堡垒:深入解析 Oracle 高可用与容灾技术体系

在当今数字化时代,数据是企业的核心资产,而承载这些数据的数据库系统的连续性与稳定性直接关系到企业的生死存亡。一次计划外的停机或灾难性的数据丢失,带来的不仅是经济上的巨大损失,更是对品牌信誉和客户信任的致命打击。因此&a…

【3D算法技术入门】如何基于建筑图片重建三维数字资产?

要基于建筑图片重建三维数字资产是一个复杂的计算机视觉任务,涉及图像采集、特征提取、相机姿态估计、稠密重建和三维模型优化等多个步骤。下面我将提供一个基于Python的解决方案框架,使用开源库实现从图片到三维模型的基本流程。 首先需要安装必要的库&…

⭐CVPR2025 自动驾驶半监督 LiDAR 分割新范式:HiLoTs 框架深度解析

📄论文题目:HiLoTs: High-Low Temporal Sensitive Representation Learning for Semi-Supervised LiDAR Segmentation in Autonomous Driving ✍️作者及机构: R.D. Lin、Pengcheng Weng、Yinqiao Wang、Fei Wang(西安交通大学软件…

【 MYSQL | 基础篇 函数与约束 】

摘要:本文介绍数据库中的函数与约束,函数含字符串、数值、日期、流程四类,可实现字符串处理、数值计算等需求。约束分六类,重点讲外键约束的语法、删除更新行为,保证数据正确完整。思维导图1. 函数函数是指一段可以直接…

Oracle 数据库性能调优:从瓶颈诊断到精准优化之道

引言:性能优化的本质在当今数据驱动的时代,数据库性能直接关系到企业的运营效率和用户体验。Oracle 作为全球领先的关系型数据库管理系统,承载着众多企业的核心业务。然而,随着数据量的增长和业务复杂度的提升,数据库性…

杨校老师竞赛课堂之C++语言GESP一级笔记

考试大纲 GESP一级考试大纲 计算机基础与编程环境 计算机历史 变量的定义与使用 基本数据类型(整型、浮点型、字符型、布尔型) 输入与输出(cin与cout、scanf与printf) 基本运算(算术运算、关系运算、逻辑运算&am…

操作系统-管程

1. 为什么需要管程?—— 信号量 (Semaphore) 的困境在理解管程之前,你必须先知道它要解决什么问题。之前,我们使用信号量 (Semaphore) 来实现进程/线程间的同步与互斥。虽然信号量功能强大,但它存在两个主要问题:编程复…