深入理解Spring事务管理

一、事务基础概念

1.1 什么是事务?

事务(Transaction)是数据库操作的最小工作单元,具有ACID四大特性:

  • 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败

  • 一致性(Consistency):事务执行前后数据库状态保持一致

  • 隔离性(Isolation):并发事务之间相互隔离

  • 持久性(Durability):事务提交后数据永久保存

 说白了就是一组操作的集合,要么一起被执行,要么都不执行,保证数据的一致

1.2 Spring事务管理

Spring通过统一的事务抽象层,提供两种管理方式:

  • 编程式事务:通过TransactionTemplate手动控制

  • 声明式事务:通过@Transactional注解自动管理(推荐方式)

 二、事务核心操作流程

三、Spring事务实战

3.1 基础配置

@Configuration
@EnableTransactionManagement
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(...);
    }
    
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

3.2 转账案例实现

public interface BankService {
    void transfer(String from, String to, BigDecimal amount);
}

@Service
public class BankServiceImpl implements BankService {
    
    @Autowired
    private AccountDao accountDao;
    
    @Transactional
    @Override
    public void transfer(String from, String to, BigDecimal amount) {
        accountDao.debit(from, amount);  // 转出
        accountDao.credit(to, amount);   // 转入
    }
}

3.3 事务回滚示例

@Transactional(rollbackFor = {BusinessException.class})
public void processOrder(Order order) throws BusinessException {
    try {
        inventoryService.reduceStock(order);
        paymentService.processPayment(order);
    } catch (InsufficientStockException ex) {
        throw new BusinessException("库存不足", ex); // 触发回滚
    }
}

四、@Transactional注解深度解析

4.1 核心属性详解

(1)propagation:事务传播机制
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void auditLog(String message) {
    // 始终新建事务执行
}

 (2)isolation:隔离级别
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void financialReport() {
    // 保证同一事务中多次读取结果一致
}

 (3)timeout:超时控制
@Transactional(timeout = 30) // 单位:秒
public void batchProcess() {
    // 超时自动回滚
}
(4)readOnly:只读优化
@Transactional(readOnly = true)
public List<Report> generateReport() {
    // 启用只读模式优化
}
(5)rollback规则
@Transactional(
    rollbackFor = {BusinessException.class},
    noRollbackFor = {SystemErrorException.class}
)
public void businessOperation() {
    // 自定义回滚规则
}

4.2 方法可见性与事务生效

public class OrderService {
    
    // 生效:public方法
    @Transactional
    public void publicMethod() {} 
    
    // 不生效:非public方法
    @Transactional
    private void privateMethod() {}
    
    // 自调用不生效!
    public void outerMethod() {
        innerMethod(); // 事务注解失效
    }
    
    @Transactional
    public void innerMethod() {}
}

五、事务失效的常见陷阱

  1. 异常类型不匹配

    • 默认只回滚RuntimeException和Error

    • 解决方案:配置rollbackFor

  2. 数据库引擎不支持

    • MyISAM引擎不支持事务

    • 必须使用InnoDB引擎

  3. 同类方法自调用

    • 通过AOP代理调用才能生效

    • 解决方案:使用AopContext.currentProxy()

  4. 多数据源未指定

    • 当存在多个TransactionManager时需指定:

@Transactional("orderTransactionManager")

总结

Spring事务管理通过@Transactional注解实现了声明式事务的优雅封装。正确配置传播机制和隔离级别可以帮助我们有效处理并发问题,而合理的超时与只读设置则能显著提升系统性能。理解事务的底层原理,结合业务场景选择合适的配置方案,是构建高可靠分布式系统的关键。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux-网络】初识计算机网络 Socket套接字 TCP/UDP协议(包含Socket编程实战)

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、初识计算机网络 &#x1f4d6; 背景 &#x1f4d6; 网络协议 &#x1f516;OSI七层…

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …

【Rust自学】15.5. Rc<T>:引用计数智能指针与共享所有权

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.5.1. 什么是Rc<T> 所有权在大部分情况下都是清晰的。对于一个给定的值&#xff0c;程序员可以准确地推断出哪个变量拥有它。 …

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

关于matlab中rotm2eul的注释错误问题

在这里&#xff0c;写的是默认的旋转矩阵的顺序为‘ZYX’&#xff0c;对应的旋转轴的顺序为Z、Y、X。 包括网页上写的是 但是实际上&#xff0c;在实际的应用中&#xff0c;旋转的顺序应该是&#xff0c;X、Y、Z轴的顺序 即RRzRyRx 但是在矩阵运算中&#xff0c;由于YRzRyRx*X…

前端 | 深入理解Promise

1. 引言 JavaScript 是一种单线程语言&#xff0c;这意味着它一次仅能执行一个任务。为了处理异步操作&#xff0c;JavaScript 提供了回调函数&#xff0c;但是随着项目处理并发任务的增加&#xff0c;回调地狱 (Callback Hell) 使异步代码很难维护。为此&#xff0c;ES6带来了…

使用 Spring JDBC 进行数据库操作:深入解析 JdbcTemplate

目录 1. Spring JDBC 简介 2. JdbcTemplate 介绍 3. 创建数据库和表 4. 配置 Spring JDBC 5. 创建实体类 6. 使用 JdbcTemplate 实现增、删、改、查操作 7. Spring JDBC 优点 8. 小结 1. Spring JDBC 简介 Spring JDBC 是 Spring 框架中的一个模块&#xff0c;旨在简化…

基于FPGA的BT656编解码

概述 BT656全称为“ITU-R BT.656-4”或简称“BT656”,是一种用于数字视频传输的接口标准。它规定了数字视频信号的编码方式、传输格式以及接口电气特性。在物理层面上,BT656接口通常包含10根线(在某些应用中可能略有不同,但标准配置为10根)。这些线分别用于传输视频数据、…

流浪 Linux: 外置 USB SSD 安装 ArchLinux

注: ArchLinux 系统为滚动更新, 变化很快, 所以本文中的安装方法可能很快就过时了, 仅供参考. 实际安装时建议去阅读官方文档. 最近, 突然 (也没有那么突然) 有了一大堆 PC: 4 个笔记本, 2 个台式主机 (M-ATX 主板), 1 个小主机 (迷你主机). 嗯, 多到用不过来. 但是, 窝又不能…

文件读写操作

写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式&#xff1a;1.ios::out、ios::trunc 清除文件内容后打开2.ios:…

python学习——常用的内置函数汇总

文章目录 类型转换函数数学函数常用的迭代器操作函数常用的其他内置函数 类型转换函数 数学函数 常用的迭代器操作函数 实操&#xff1a; from cv2.gapi import descr_oflst [55, 42, 37, 2, 66, 23, 18, 99]# (1) 排序操作 asc_lst sorted(lst) # 升序 desc_lst sorted(l…

计算机视觉和图像处理

计算机视觉与图像处理的最新进展 随着人工智能技术的飞速发展&#xff0c;计算机视觉和图像处理作为其中的重要分支&#xff0c;正逐步成为推动科技进步和产业升级的关键力量。 一、计算机视觉的最新进展 计算机视觉&#xff0c;作为人工智能的重要分支&#xff0c;主要研究如…

解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题

macOS 系统中如何开启“任何来源”以解决安装报错问题&#xff1f; 大家好&#xff01;今天我们来聊聊在使用 macOS 系统 时&#xff0c;遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时&#xff0c;因为 macOS 会默认阻止不明开发者的…

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…

ICLR 2025收录论文:为什么动作分块对于机器人灵活性至关重要?

随着机器人学习和人类演示数据的不断增加&#xff0c;行为克隆方法逐渐成为机器人领域的研究热点。行为克隆通过模仿人类专家的演示来学习控制策略&#xff0c;但是现有方法在处理人类演示的强时间依赖性和大风格变异性方面仍面临不少挑战。 为了解决这些问题&#xff0c;近日美…

视频脚本生成器(基于openai API和streamlit)

utils.py&#xff1a; # 所有和ai交互的代码放进utils.py里&#xff08;utils 通常是 “utilities” 的缩写&#xff0c;意为 “实用工具” 或 “实用函数”&#xff09;from langchain.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from lan…

java每日精进1.31(SpringSecurity)

在所有的开发的系统中&#xff0c;都必须做认证(authentication)和授权(authorization)&#xff0c;以保证系统的安全性。 一、基础使用 1.依赖 <dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.bo…

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里&#xff0c;随着项目的增长和需求的变化&#xff0c;如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …

一、html笔记

(一)前端概述 1、定义 前端是Web应用程序的前台部分,运行在PC端、移动端等浏览器上,展现给用户浏览的网页。通过HTML、CSS、JavaScript等技术实现,是用户能够直接看到和操作的界面部分。上网就是下载html文档,浏览器是一个解释器,运行从服务器下载的html文件,解析html、…