当前位置: 首页 > news >正文

Spring事务管理实战:从注解到进阶

文章目录

  • 前言
    • 事务管理
      • 一、核心注解:@Transactional
        • 1. 作用与执行流程
        • 2. 注解适用位置
      • 二、进阶配置:rollbackFor 与 propagation
        • 1. rollbackFor:指定回滚异常
        • 2. propagation:事务传播行为
      • 三、事务传播行为实践:新增员工 + 记录日志
      • 四、事务四大特性(ACID)与 Spring 实现
      • 五、最佳实践与避坑
        • 1. 必做配置:日志调试
        • 2. 避坑点:事务失效场景
        • 3. 生产级配置模板
      • 六、总结:Spring 事务核心价值
  • 总结
      • 核心注解与基础用法
      • 进阶配置与场景适配
      • 实践技巧与注意事项


前言

在现代应用开发中,事务管理是保障数据操作原子性和一致性的基石。Spring框架通过声明式事务极大简化了开发复杂度,但灵活运用仍需深入理解其底层机制与配置策略。本文系统梳理Spring事务的核心注解、进阶配置及典型场景实践,旨在帮助开发者规避常见陷阱,构建健壮的数据访问层。无论是基础的@Transactional使用,还是复杂的传播行为控制,均可通过代码示例和配置说明快速掌握。


事务管理

结合代码与场景,梳理核心用法、进阶配置及实践技巧,让事务控制更清晰

一、核心注解:@Transactional

1. 作用与执行流程
  • 作用:标记方法 / 类 / 接口,交给 Spring 管理事务

    • 方法执行前:自动开启事务(创建数据库连接,设置事务属性)
    • 方法执行后:
      • 无异常 → 提交事务(持久化数据修改)
      • 有异常 → 回滚事务(撤销所有未提交操作)
  • 代码示例(方法级)

    @Service
    public class EmpServiceImpl implements EmpService {@Autowired private EmpMapper empMapper;@Autowired private EmpExprMapper empExprMapper;// 标记方法,Spring自动管理事务@Transactional@Overridepublic void save(Emp emp) {// 1. 补全基础属性(创建时间、更新时间)emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());// 2. 保存员工基本信息(插入emp表)empMapper.insert(emp); // 3. 模拟异常(触发回滚)int i = 1 / 0; // 4. 保存工作经历(若异常,步骤2的插入也会回滚)empExprMapper.insertBatch(emp.getExprList()); }
    }
    
2. 注解适用位置
  • 方法:精准控制单个方法的事务(推荐,粒度细)

  • :作用于类中

    所有方法

    (批量控制,如整个

    EmpServiceImpl
    

    的方法都需事务)

    @Service
    // 类上标记,所有方法默认开启事务
    @Transactional 
    public class EmpServiceImpl implements EmpService {// 无需重复标记,继承类上的事务配置@Overridepublic void save(Emp emp) { ... } 
    }
    
  • 接口:作用于接口的所有实现类方法(不推荐,接口是规范层,事务属于实现细节)

二、进阶配置:rollbackFor 与 propagation

1. rollbackFor:指定回滚异常
  • 默认行为:仅对 运行时异常(RuntimeException) 回滚,编译时异常(如 IOException)不回滚

  • 需求:希望所有异常都触发回滚(如保存员工信息时,无论啥异常都回滚)

  • 代码示例:

    @Transactional(rollbackFor = {Exception.class}) // 捕获所有异常回滚
    public void save(Emp emp) {empMapper.insert(emp); // 异常时,此操作回滚
    }
    
2. propagation:事务传播行为
  • 定义:一个事务方法调用另一个事务方法时,如何控制事务(新建、加入现有事务等)
  • 常见场景与配置
属性值含义
REQUIRED (默认)【默认值】需要事务,有则加入,无则创建新事务
**REQUIRES_NEW **需要新事务,无论有无,总是创建新事务 (希望他两个或者多个方法在独立的事务中运行时)
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
**NEVER **必须没事务,否则抛异常
. . .
  • 代码示例(REQUIRES_NEW 场景:记录日志):

    @Service
    public class EmpLogServiceImpl implements EmpLogService {@Autowired private EmpLogMapper empLogMapper;// 独立事务:即使主事务回滚,此操作也提交@Transactional(propagation = Propagation.REQUIRES_NEW) public void insertLog(EmpLog empLog) {empLogMapper.insert(empLog); }
    }// 主业务:保存员工+记录日志
    @Service
    public class EmpServiceImpl implements EmpService {@Autowired private EmpLogService empLogService;@Transactional(rollbackFor = Exception.class)public void save(Emp emp) {try {empMapper.insert(emp); // 主操作// 记录日志(独立事务,主操作回滚不影响日志)empLogService.insertLog(new EmpLog("新增员工:" + emp.getName())); } catch (Exception e) {// 主操作回滚,但日志已独立提交throw new RuntimeException("保存失败", e); }}
    }
    

三、事务传播行为实践:新增员工 + 记录日志

需求:

  • 新增员工时,无论成功 / 失败,必须记录操作日志(日志需独立提交,不受主事务回滚影响)

  • 实现步骤

    1. 准备日志表 emp_log、实体类 EmpLog、Mapper EmpLogMapper
    2. 主业务 save(Emp emp) 标记 @Transactional(控制员工新增的事务)
    3. 日志方法 insertLog(EmpLog empLog) 标记 @Transactional(propagation = Propagation.REQUIRES_NEW)(独立事务)
  • 完整代码

    @Service
    public class EmpServiceImpl implements EmpService {@Autowired private EmpMapper empMapper;@Autowired private EmpExprMapper empExprMapper;@Autowired private EmpLogService empLogService; // 日志服务// 主事务:员工新增,异常则回滚@Transactional(rollbackFor = Exception.class) @Overridepublic void save(Emp emp) {try {// 1. 补全属性 + 保存员工emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp); // 2. 保存工作经历(若异常,主事务回滚)empExprMapper.insertBatch(emp.getExprList()); // 3. 记录日志(独立事务,主事务回滚不影响)EmpLog empLog = new EmpLog(null, LocalDateTime.now(), "新增员工:" + emp.getName());empLogService.insertLog(empLog); } finally {// 无论成功/失败,日志都会执行(由 REQUIRES_NEW 保证独立提交)}}
    }@Service
    public class EmpLogServiceImpl implements EmpLogService {@Autowired private EmpLogMapper empLogMapper;// 独立事务:即使主事务回滚,日志仍提交@Transactional(propagation = Propagation.REQUIRES_NEW) @Overridepublic void insertLog(EmpLog empLog) {empLogMapper.insert(empLog); }
    }
    

四、事务四大特性(ACID)与 Spring 实现

特性含义Spring 如何保证代码 / 配置关联
原子性事务操作要么全成功,要么全失败通过 @Transactional 回滚机制实现方法内多个操作(如 insert + insertBatch),异常时统一回滚
一致性事务前后数据状态合法(如转账总额不变)依赖业务逻辑 + 数据库约束(主键、外键等)保存员工时,createTime 非空约束;金额字段类型为 BigDecimal 避免精度丢失
隔离性多事务并发互不干扰(避免脏读、幻读)通过 事务隔离级别(如 Isolation.READ_COMMITTED配置 @Transactional(isolation = Isolation.READ_COMMITTED)
持久性事务提交后,数据永久保存依赖数据库的日志(如 MySQL 的 redo log)Spring 事务提交后,数据库保证刷盘持久化(由数据库引擎实现)

五、最佳实践与避坑

1. 必做配置:日志调试
  • 需求:排查事务不生效、回滚异常等问题

  • 配置 application.yml

    logging:level:# 开启 Spring 事务日志(DEBUG 级别)org.springframework.jdbc.support.JdbcTransactionManager: debug 
    
  • 作用:输出事务开启、提交、回滚的详细日志,快速定位问题(如 “事务未开启”“回滚原因”)

2. 避坑点:事务失效场景
  • 场景 1:方法非 public(Spring 事务基于代理,private 方法无法被代理)

    @Service
    public class EmpServiceImpl {// 错误:private 方法,事务不生效!@Transactional private void save(Emp emp) { ... } 
    }
    
  • 场景 2自调用(同一类中,无代理介入,事务不生效)

    @Service
    public class EmpServiceImpl {public void saveAndLog(Emp emp) {// 自调用,无代理,save 的事务不生效!this.save(emp); }@Transactionalpublic void save(Emp emp) { ... } 
    }
    
  • 场景 3:异常被捕获且未抛出(事务无法感知异常,不会回滚

    @Transactional
    public void save(Emp emp) {try {empMapper.insert(emp);int i = 1 / 0; // 触发异常} catch (Exception e) {// 错误:未抛出异常,事务认为“成功”,不会回滚!log.error("保存失败", e); }
    }
    
3. 生产级配置模板
@Transactional(rollbackFor = {Exception.class},        // 所有异常回滚propagation = Propagation.REQUIRED,    // 默认传播行为(推荐)isolation = Isolation.READ_COMMITTED,  // 读已提交(平衡性能与隔离性)timeout = 30                           // 事务超时时间(30秒,避免长期占用资源)
)
public void save(Emp emp) { ... }

六、总结:Spring 事务核心价值

  • 简化开发:通过 @Transactional 注解,无需手动写 begin/commit/rollback
  • 保证数据一致性:复杂业务(如员工新增 + 工作经历 + 日志)中,确保数据要么全成功,要么全失败
  • 灵活控制:通过 rollbackForpropagation 等配置,适配不同业务场景(如日志独立提交、强制回滚所有异常)

一句话概括:Spring 事务让开发者聚焦业务逻辑,把 “数据一致性” 的复杂控制交给框架,是企业级应用必备的基础能力!

总结

事务管理是确保数据一致性和完整性的关键技术,通过合理的配置和使用可以显著提升系统稳定性。在Spring框架中,事务管理主要通过@Transactional注解实现,支持灵活的事务控制和传播行为配置。以下是关键点总结:


核心注解与基础用法

@Transactional注解是事务管理的核心,可应用于方法、类或接口。方法级注解提供细粒度控制,类级注解统一管理所有方法的事务行为。默认情况下,事务在方法执行前开启,方法正常结束后提交,异常时回滚。

java复制插入@Transactional
public void save(Emp emp) {empMapper.insert(emp);if (condition) throw new RuntimeException("Trigger rollback");
}
复制插入

进阶配置与场景适配

  1. 回滚规则定制
    • 通过rollbackFor指定需回滚的异常类型,如rollbackFor = Exception.class覆盖默认仅回滚运行时异常的行为。
    • 结合noRollbackFor可排除特定异常不触发回滚。
  2. 传播行为控制
    • REQUIRED(默认):加入当前事务或新建事务。
    • REQUIRES_NEW:始终创建新事务,适用于需独立提交的操作(如日志记录)。
    • 其他如SUPPORTSNOT_SUPPORTED等满足不同场景需求。
java复制插入@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logOperation(String message) {logMapper.insert(message); // 独立提交
}
复制插入

实践技巧与注意事项

  • 避免自调用问题
    类内方法调用带@Transactional的方法会绕过代理,导致事务失效。需通过注入自身实例或拆分服务解决。
  • 事务边界设计
    事务应尽量短小,避免长时间占用连接。复杂业务可拆分为多个事务方法,通过传播行为组合。
  • 调试与监控
    启用Spring事务日志(logging.level.org.springframework.transaction=DEBUG)辅助排查问题。
http://www.lryc.cn/news/619347.html

相关文章:

  • Spring 源码学习(十)—— DispatcherServlet
  • 【一步AI】模型压缩:减小模型体积与计算量
  • YOLOv8 级联检测:在人脸 ROI 内检测眼镜(零改源码方案)
  • 第十六届蓝桥杯青少组C++省赛[2025.8.9]第二部分编程题(1 、庆典队列)
  • Excel怎么筛选重复项?【图文详解】查找/删除重复项?查找重复项公式?如何去重?
  • [QtADS]解析demo.pro
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • Electron自定义菜单栏及Mac最大化无效的问题解决
  • XML头部声明发送者信息的实现方法
  • C# 微软依赖注入 (Microsoft.Extensions.DependencyInjection) 详解
  • CV 医学影像分类、分割、目标检测,之【肝脏分割】项目拆解
  • windows常用的快捷命令
  • 机器学习实战·第三章 分类(2)
  • docker 容器内编译onnxruntime
  • git clone 支持在命令行临时设置proxy
  • CV 医学影像分类、分割、目标检测,之【腹腔多器官语义分割】项目拆解
  • 何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
  • Video_AVI_Packet(2)
  • 基于RTSP|RTMP低延迟视频链路的多模态情绪识别系统构建与实现
  • 日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理
  • 进阶向:Python编写自动化邮件发送程序
  • Jenkins一直无法启动,怎么办?
  • 论文分享 | Flashboom:一种声东击西攻击手段以致盲基于大语言模型的代码审计
  • 守拙以致远:个人IP的长青之道|创客匠人
  • Hive 创建事务表的方法
  • 自建知识库,向量数据库 体系建设(四)之文本向量与相似度计算——仙盟创梦IDE
  • java中list的api详细使用
  • 无人机航拍数据集|第15期 无人机人员目标检测YOLO数据集4923张yolov11/yolov8/yolov5可训练
  • pt-online-schema-change 全解析:MySQL 表结构变更的安全之道
  • clickhouse集群的安装与部署