跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring 事务核心:@Transactional 注解与传播机制详解

Spring 事务管理是确保数据库操作 ACID 特性的核心机制。重点讲解 @Transactional 注解的配置细节,包括默认回滚规则、异常处理及隔离级别设置。同时深入剖析七种事务传播行为,如 REQUIRED 的默认加入策略、REQUIRES_NEW 的新建事务机制以及 NESTED 嵌套事务的回滚特性,帮助开发者在实际项目中精准控制事务边界与一致性。

锁机制发布于 2026/3/26更新于 2026/7/738 浏览
Spring 事务核心:@Transactional 注解与传播机制详解

1. 概述

Spring 事务管理是框架中确保数据库操作 原子性、一致性、隔离性和持久性 (ACID) 的核心机制。它支持声明式和编程式两种管理方式,其中声明式事务通过 @Transactional 注解实现,无需手动编写事务代码,大大简化了开发流程。

相较于编程式事务,声明式事务更易于维护和理解。关于事务的基本概念(如 ACID 的具体含义),这里不再赘述,我们直接聚焦于 Spring 中的实际配置与应用。

2. @Transactional 注解

作用与级别

@Transactional 提供了声明式事务管理能力。开发者只需在方法或类上添加此注解,Spring 容器就会自动处理事务的开启、提交和回滚。

  • 作为类注解:为类中所有 public 方法生效。
  • 作为方法注解:默认仅对 public 方法生效,非 public 方法通常会被忽略。
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
    private final UserService userService;

    @Autowired
    public TestController(UserService userService) {
        this.userService = userService;
    }

    @Transactional
    @RequestMapping("/test1")
    public String test1(String userName, String password) {
        UserInfo userInfo = new UserInfo();
        userInfo.setUserName(userName);
        userInfo.setPassword(password);
        Integer result = userService.register(userInfo);
        if (result == 1) {
            log.info("test1 注册成功,userName:{},password:{}", userName, password);
        }
        return "注册成功";
    }
}

在实际调用时,如果业务逻辑正常,数据会写入数据库;若抛出异常且符合回滚条件,事务会自动回滚。

2.1 rollbackFor

默认情况下,Spring 仅在抛出 非受查异常 (RuntimeException) 或 错误 (Error) 时触发回滚。对于受查异常(Checked Exception),默认不会回滚。

指定回滚类型

如果需要受查异常也能触发回滚,可以通过 rollbackFor 属性显式指定。

@Transactional(rollbackFor = Exception.class)
@RequestMapping("/test4")
public String test4(String userName, String password) throws IOException {
    UserInfo userInfo = new UserInfo();
    userInfo.setUserName(userName);
    userInfo.setPassword(password);
    Integer result = userService.register(userInfo);
    if (result == 1) {
        log.info("test4 注册成功,userName:{},password:{}", userName, password);
        throw new IOException(); // 受查异常
    }
    return "注册成功";
}

此时即使抛出 IOException,事务也会回滚。

抛出非受查异常时

如果不配置 rollbackFor,抛出 RuntimeException 会触发回滚。

@Transactional
@RequestMapping("/test3")
public String test3(String userName, String password) {
    UserInfo userInfo = new UserInfo();
    userInfo.setUserName(userName);
    userInfo.setPassword(password);
    Integer result = userService.register(userInfo);
    if (result == 1) {
        log.info("test3 注册成功,userName:{},password:{}", userName, password);
        throw new RuntimeException(); // 非受查异常
    }
    return "注册成功";
}
抛出受查异常时

若未配置 rollbackFor,抛出受查异常则不会回滚。

@Transactional
@RequestMapping("/test2")
public String test2(String userName, String password) throws IOException {
    UserInfo userInfo = new UserInfo();
    userInfo.setUserName(userName);
    userInfo.setPassword(password);
    Integer result = userService.register(userInfo);
    if (result == 1) {
        log.info("test2 注册成功,userName:{},password:{}", userName, password);
        throw new IOException(); // 受查异常,默认不回滚
    }
    return "注册成功";
}

2.2 isolation

用于指定事务的隔离级别,避免脏读、不可重复读和幻读等问题。

  • Isolation.DEFAULT:使用底层数据库默认的隔离级别。
  • Isolation.READ_UNCOMMITTED:读未提交(最低级别,允许脏读)。
  • Isolation.READ_COMMITTED:读已提交(大多数数据库默认)。
  • Isolation.REPEATABLE_READ:可重复读(MySQL 默认)。
  • Isolation.SERIALIZABLE:串行化(最高级别,性能较差)。

具体每种隔离级别的效果差异较大,建议根据业务场景选择,通常保持默认即可。

2.3 propagation

事务传播行为定义了当前事务方法被另一个事务方法调用时,事务应如何传播。Spring 提供了 7 种传播行为,均基于 Propagation 枚举类实现。

Propagation.REQUIRED

默认传播行为。如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务。这是最常用的模式。

Propagation.SUPPORTS

如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行。

Propagation.MANDATORY

强制要求当前必须存在事务并加入,否则抛出异常。适用于必须在事务上下文中运行的方法。

Propagation.REQUIRES_NEW

无论当前是否存在事务,都新建一个事务。新事务与当前事务独立,互不干扰。常用于日志记录等需要独立提交的操作。

Propagation.NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,则挂起该事务。适用于不需要事务支持但处于事务环境中的方法。

Propagation.NEVER

强制要求当前不能存在事务,否则抛出异常。这与 MANDATORY 相反。

Propagation.NESTED

如果当前存在事务,则在嵌套事务中执行;如果不存在事务,则行为与 Propagation.REQUIRED 相同。嵌套事务的回滚不影响外部事务,但外部事务回滚会导致嵌套事务回滚。这适用于需要部分回滚的场景,例如主流程失败需保留部分子流程数据的情况。

目录

  1. 1. 概述
  2. 2. @Transactional 注解
  3. 作用与级别
  4. 2.1 rollbackFor
  5. 指定回滚类型
  6. 抛出非受查异常时
  7. 抛出受查异常时
  8. 2.2 isolation
  9. 2.3 propagation
  10. Propagation.REQUIRED
  11. Propagation.SUPPORTS
  12. Propagation.MANDATORY
  13. Propagation.REQUIRES_NEW
  14. Propagation.NOT_SUPPORTED
  15. Propagation.NEVER
  16. Propagation.NESTED
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ROS2 中的 TF 系统:机器人坐标系管理
  • DeepSeek 深度使用指南:提示词工程与本地知识库搭建
  • Java 异常体系结构与处理实战
  • AI 绘画工具背后的视觉技术:Stable Diffusion 解析
  • GitHub 日榜精选(2026-01-08):AI Agent、Web 分析与开发工具
  • 火影忍者主题网页设计与实现
  • Sora2 Pro API Python 接入指南:4K 视频生成实战
  • 基于整洁架构优化 Gradle Module 设计与依赖管理
  • 2026 年值得关注的十大 JavaScript 框架
  • PETRV2-BEV 模型训练实战:Python 全流程代码解析
  • C++ 搜索二叉树:特性、实现与应用
  • C++ Lambda 表达式详解:语法、捕获与底层原理
  • C++ 基础:引用、inline 及 nullptr 用法
  • C++ 异常处理机制详解与避坑指南
  • PHP 原生查询性能与安全优化实战
  • C++ 并发模型:内存序、可见性与指令重排
  • 16 届蓝桥杯 Java 组省赛真题详解:思路与代码实现
  • LiuJuan20260223Zimage 镜像目录结构解析与模型权重规范
  • Llama 2 ONNX 模型快速部署指南
  • 鸿蒙应用性能优化与 Next 原生合规实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online