深入理解Spring事务管理

news2025/2/3 1:35:13

一、事务基础概念

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

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

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

相关文章

自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)

先修复上一次的bug&#xff0c;添加新指令&#xff0c;并增加图形界面 #include <graphics.h> #include <conio.h> #include <windows.h> #include <commdlg.h> #include <iostream> #include <fstream> #include <sstream> #inclu…

ASP.NET Core 启动并提供静态文件

ASP.NET Core 启动并提供静态文件 即是单个可执行文件&#xff0c;它既运行 API 项目&#xff0c;也托管 前端项目&#xff08;通常是前端的发布文件&#xff09;。 这种方式一般是通过将 前端项目 的发布文件&#xff08;例如 HTML、CSS、JavaScript&#xff09;放入 Web AP…

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…

变量和常量

一.变量 1.标准声明 var 变量名 变量类型 变量声明行末不需要分号 2..批量声明 package main import "fmt" func main(){var(a string b int c boold float32)}3.变量的初始化 var a int 10 var b float321.1 4.类型推导 var name"tom" var age18 fmt.Pr…

大模型概述(方便不懂技术的人入门)

1 大模型的价值 LLM模型对人类的作用&#xff0c;就是一个百科全书级的助手。有多么地百科全书&#xff0c;则用参数的量来描述&#xff0c; 一般地&#xff0c;大模型的参数越多&#xff0c;则该模型越好。例如&#xff0c;GPT-3有1750亿个参数&#xff0c;GPT-4可能有超过1万…

流浪 Linux: 外置 USB SSD 安装 ArchLinux

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

Hot100之子串

560和为K的子数组 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列 思路解析 ps&#xff1a;我们的presum【0】就是0&#xff0c;如果没有这个0的话我们的第一个元素就无法减去上…

网络工程师 (11)软件生命周期与开发模型

一、软件生命周期 前言 软件生命周期&#xff0c;也称为软件开发周期或软件开发生命周期&#xff0c;是指从软件项目的启动到软件不再被使用为止的整个期间。这个过程可以细分为多个阶段&#xff0c;每个阶段都有其特定的目标、任务和产出物。 1. 问题定义与需求分析 问题定义…

(三)QT——信号与槽机制——计数器程序

目录 前言 信号&#xff08;Signal&#xff09;与槽&#xff08;Slot&#xff09;的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制&#xff0c;用于不同对象之间的事件响…

hot100_21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

安全防护前置

就业概述 网络安全工程师/安全运维工程师/安全工程师 安全架构师/安全专员/研究院&#xff08;数学要好&#xff09; 厂商工程师&#xff08;售前/售后&#xff09; 系统集成工程师&#xff08;所有计算机知识都要会一点&#xff09; 学习目标 前言 网络安全事件 蠕虫病毒--&…

01-六自由度串联机械臂(ABB)位置分析

ABB工业机器人&#xff08;IRB2600&#xff09;如下图所示&#xff08;d1444.8mm&#xff0c;a1150mm&#xff0c;a2700mm&#xff0c;a3115mm&#xff0c;d4795mm&#xff0c;d685mm&#xff09;&#xff0c;利用改进DH法建模&#xff0c;坐标系如下所示&#xff1a; 利用改进…

JVM运行时数据区域-附面试题

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…

HTML(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…

《苍穹外卖》项目学习记录-Day10订单状态定时处理

利用Cron表达式生成器生成Cron表达式 1.处理超时订单 查询订单表把超时的订单查询出来&#xff0c;也就是订单的状态为待付款&#xff0c;下单的时间已经超过了15分钟。 //select * from orders where status ? and order_time < (当前时间 - 15分钟) 遍历集合把数据库…

AJAX综合案例——图书管理

黑马程序员视频地址&#xff1a; AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖的第25集视频&#xff0c…

30.Word:设计并制作新年贺卡以及标签【30】

目录 NO1.2 NO3邮件合并-信函 NO4邮件合并-标签​ NO1.2 另存为/F12&#xff1a;考生文件夹&#xff1a;Word.docx布局→页面设置对话框→页边距&#xff1a;上下左右→纸张&#xff1a;宽度/高度&#xff08;先调页边距&#x1f197;&#xff09;设计→页面颜色→填充效果→…

Nginx开发01:基础配置

一、下载和启动 1.下载、使用命令行启动&#xff1a;Web开发&#xff1a;web服务器-Nginx的基础介绍&#xff08;含AI文稿&#xff09;_nginx作为web服务器,可以承担哪些基本任务-CSDN博客 注意&#xff1a;我配置的端口是81 2.测试连接是否正常 访问Welcome to nginx! 如果…

数据分析系列--⑨RapidMiner训练集、测试集、验证集划分

一、数据集获取 二、划分数据集 1.导入和加载数据 2.数据集划分 2.1 划分说明 2.2 方法一 2.3 方法二 一、数据集获取 点击下载数据集 此数据集包含538312条数据. 二、划分数据集 1.导入和加载数据 2.数据集划分 2.1 划分说明 2.2 方法一 使用Filter Example Range算子. …

C基础寒假练习(6)

一、终端输入行数&#xff0c;打印倒金字塔 #include <stdio.h> int main() {int rows;printf("请输入倒金字塔的行数: ");scanf("%d", &rows);for (int i rows; i > 0; i--) {// 打印空格for (int j 0; j < rows - i; j) {printf(&qu…