Spring 事务管理核心机制与传播行为应用

news2025/4/21 12:49:22

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 {
    
    @Autowired
    private AccountDao accountDao;

    @Transactional  // 开启事务管理
    @Override
    public 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 {
    
    @Autowired
    private 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 {
    
    @Autowired
    private LogDao logDao;

    // 使用 REQUIRES_NEW 传播行为:独立事务
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void addLog(String logInfo) {
        logDao.insertLog(logInfo);
        // 即使转账失败,日志也会提交
    }
}

@Service
public class AccountServiceImpl implements AccountService {
    
    @Autowired
    private AccountDao accountDao;

    @Autowired
    private LogService logService;

    @Transactional
    @Override
    public 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.coloradmin.cn/o/2339430.html

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

相关文章

集合框架(重点)

1. 什么是集合框架 List有序插入对象,对象可重复 Set无序插入对象,对象不可重复(重复对象插入只会算一个) Map无序插入键值对象,键只唯一,值可多样 (这里的有序无序指的是下标,可…

IPv4地址分类与常用网络地址详解

常见的 IPv4 地址分类: 1. A 类地址(Class A) 范围:0.0.0.0 到 127.255.255.255 默认子网掩码:255.0.0.0 或 /8 用途:通常用于大型网络,例如大型公司、组织。 特点: 网络地址范围…

模拟实现memmove,memcpy,memset

目录 前言 一、模拟实现memmove 代码演示: 二、模拟实现memcpy 代码演示: 三、模拟实现memset 代码演示: 总结 前言 这篇文章主要讲解了库函数的模拟实现,包含memmove,memcpy,memset 一、模拟实现m…

RHCSA Linux 系统文件内容显示2

6. 过滤文件内容显示 grep (1)功能:在指定普通文件中查找并显示含指定字符串的行,也可与管道符连用。 (2)格式:grep 选项... 关键字字符串 文件名... (3)常用选项及说…

【2】Kubernetes 架构总览

Kubernetes 架构总览 主节点与工作节点 主节点 Kubernetes 的主节点(Master)是组成集群控制平面的关键部分,负责整个集群的调度、状态管理和决策。控制平面由多个核心组件构成,包括: kube-apiserver:集…

Redis下载

目录 安装包 1、使用.msi方式安装 2.使用zip方式安装【推荐方式】 添加环境变量 配置后台运行 启动: 1.startup.cmd的文件 2.cmd窗口运行 3.linux源码安装 (1)准备安装环境 (2)上传安装文件 (3&…

React 文章 分页

删除功能 携带路由参数跳转到新的路由项 const navigate useNavigate() 根据文章ID条件渲染

OpenCV 图形API(39)图像滤波----同时计算图像在 X 和 Y 方向上的一阶导数函数SobelXY()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::gapi::SobelXY 函数是 OpenCV 的 G-API 模块中用于同时计算图像在 X 和 Y 方向上的一阶导数(即 Sobel 边缘检测)的一…

传导发射测试(CE)和传导骚扰抗扰度测试(CS)

传导发射测试(CE): 测量接收机: 是EMI测试中最常用的基本测试仪器,仪器类型包括准峰值测量接收机、峰值测量接收机、平均值测量接收机和均方根值测量接收机。测量接收机的几个重要指标分别是:6dB处的带宽、充电时间常数、放电时…

ubuntu 查看现在服务使用的端口

1. 使用netstat命令 netstat是一个常用的网络工具,可以显示网络连接、路由表、接口统计等信息。虽然在较新的系统中netstat可能被ss命令替代,但仍然可以通过安装net-tools包来使用它。 安装net-tools: sudo apt-get install net-tools 查看…

即插即用模块(1) -MAFM特征融合

(即插即用模块-特征处理部分) 一、(2024) MAFM&MCM 特征融合特征解码 paper:MAGNet: Multi-scale Awareness and Global fusion Network for RGB-D salient object detection 1. 多尺度感知融合模块 (MAFM) 多尺度感知融合模块 (MAFM) 旨在高效融合 RGB 和深度…

(学习总结34)Linux 库制作与原理

Linux 库制作与原理 库的概念静态库操作归档文件命令 ar静态库制作静态库使用 动态库动态库制作动态库使用与运行搜索路径问题解决方案方案2:建立同名软链接方案3:使用环境变量 LD_LIBRARY_PATH方案4:ldconfig 方案 使用外部库目标文件ELF 文…

DSP28335入门学习——第一节:工程项目创建

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.20 DSP28335开发板学习——第一节:工程项目创建 前言开发板说明引用解答…

MDG 实现后端主数据变更后快照自动刷新的相关设置

文章目录 前言实现过程BGRFC期初配置(可选)设置 MDG快照 BGRFC维护BP出站功能模块 监控 前言 众所周知,在MDG变更请求创建的同时,所有reuse模型实体对应的快照snapshot数据都会记录下来。随后在CR中,用户可以修改这些…

【Linux】Linux 操作系统 - 05 , 软件包管理器和 vim 编辑器的使用 !

文章目录 前言一、软件包管理器1 . 软件安装2 . 包管理器3 . Linux 生态 二、软件安装 、卸载三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替换模式7 . V-BLOCK 模式8 . 技巧补充 总结 前言 本篇笔者将会对软件包管理…

【操作系统原理05】存储器管理

大纲 文章目录 大纲一. 内存基础知识0.大纲1.什么是内存2.进程运行基本原理2.1 指令工作原理2.2逻辑地址VS物理地址2.3 从写程序到程序运行完整运行三种链接方式 二.内存管理0.大纲1.操作系统进行内存管理 三.覆盖与交换0.大纲1.覆盖技术2.交换技术 四.连续分配管理方式0.大纲1…

学习笔记—C++—string(练习题)

练习题 仅仅反转字母 917. 仅仅反转字母 - 力扣(LeetCode) 题目 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。 返回反转后的 s 。…

[Swift]Xcode模拟器无法请求http接口问题

1.以前偷懒一直是这样设置 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/><key>NSAllowsArbitraryLoadsInWebContent</key><true/> </dict> 现在我在Xcode16.3上&#xff…

返回之术:用 navigate(-1) 闯荡前端江湖

前言 在前端这片江湖,页面跳转宛如轻功水上漂,来去无踪,飘忽不定。但其中有一门绝学,专治“回头是岸”之需求,那便是 React Router 中的 navigate(-1) 身法。 昔日我闯荡项目林,误入“下一页”禁地,一脚踏空,身陷页面迷阵。正当我焦头烂额之际,师父袖袍一挥,口吐一…

网络编程3

day3 一、服务器模型 1.循环服务器模型 同一个时刻只能响应一个客户端的请求 2.并发服务器模型 2.1含义 同一个时刻可以响应多个客户端的请求&#xff0c;常用的模型有多进程模型/多线程模型/IO多路复用模型。 2.2多进程模型 每来一个客户端连接&#xff0c;开一个子进程来专门…