跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Spring 事务管理实战:@Transactional 注解与传播机制深度解析

Spring 事务管理通过 @Transactional 注解实现声明式控制,涵盖回滚规则、隔离级别及七种传播行为。重点解析默认异常回滚机制、受检异常处理差异,以及 REQUIRED、NESTED 等关键传播策略的实际应用场景,帮助开发者规避常见事务失效问题。

邪神洛基发布于 2026/3/28更新于 2026/4/265 浏览
Spring 事务管理实战:@Transactional 注解与传播机制深度解析

Spring 事务管理核心

Spring 事务管理是确保数据库操作符合 ACID(原子性、一致性、隔离性和持久性)特性的核心机制。虽然支持编程式管理,但实际开发中更推荐声明式事务。通过 @Transactional 注解,开发者无需手动编写 begin、commit 或 rollback 代码,Spring 框架会自动处理事务的生命周期。

@Transactional 注解详解

该注解可作用于类或方法级别。作为类注解时,默认仅对类中所有 public 方法生效;作为方法注解时,同样遵循此规则。若将非 public 方法标记为事务,通常不会生效。

@RequestMapping("/test")
@RestController
@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) 时触发回滚。如果业务逻辑抛出了受查异常(如 IOException),事务默认会提交。

指定回滚类型

若需捕获受查异常并回滚,必须显式配置 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,事务也会回滚。反之,若未配置且抛出 RuntimeException,则正常回滚;若抛出受查异常,则提交。

2.2 isolation:隔离级别

用于指定事务的隔离级别,可选值包括:

  • Isolation.DEFAULT: 使用底层数据库默认的隔离级别。
  • Isolation.READ_UNCOMMITTED: 读未提交。
  • Isolation.READ_COMMITTED: 读已提交。
  • Isolation.REPEATABLE_READ: 可重复读。
  • Isolation.SERIALIZABLE: 串行化。

不同隔离级别的具体效果涉及脏读、不可重复读和幻读等概念,具体取决于数据库实现。

2.3 propagation:传播行为

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

Propagation.REQUIRED

默认行为。如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务。绝大多数场景下使用此项即可。

Propagation.SUPPORTS

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

Propagation.MANDATORY

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

Propagation.REQUIRES_NEW

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

Propagation.NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,则挂起该事务。

Propagation.NEVER

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

Propagation.NESTED

如果当前存在事务,则在嵌套事务中执行;如果不存在事务,则行为与 Propagation.REQUIRED 相同。嵌套事务的回滚不影响外部事务,但外部事务回滚会导致嵌套事务回滚。这适用于需要部分回滚的场景,类似于数据库中的 Savepoint。

目录

  1. Spring 事务管理核心
  2. @Transactional 注解详解
  3. 2.1 rollbackFor:回滚策略
  4. 指定回滚类型
  5. 2.2 isolation:隔离级别
  6. 2.3 propagation:传播行为
  7. Propagation.REQUIRED
  8. Propagation.SUPPORTS
  9. Propagation.MANDATORY
  10. Propagation.REQUIRES_NEW
  11. Propagation.NOT_SUPPORTED
  12. Propagation.NEVER
  13. Propagation.NESTED
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • TradingAgents-CN 本地化部署实战指南
  • macOS 下升级 Python 的几种主流方案
  • CountBot 架构解析:21K 行代码实现生产级 AI Agent 框架
  • Windows 系统下 Neo4j 与 JDK 安装配置实战
  • 多卡部署 Qwen3-VL-32B:vLLM 死锁与 llama.cpp 实战对比
  • KrLongAI 旗博士本地部署 AI 数字人口播自动化工程实践
  • Ubuntu 下 llama.cpp 编译与性能调优实战
  • 字节开源 DeerFlow 2.0:重构 Super Agent 运行时基础设施
  • 滑动窗口算法核心原理与经典例题解析
  • 本地部署 AI 量化分析平台:Docker 配置与波浪理论实战
  • Flet:用 Python 构建跨平台桌面与 Web 应用
  • 秋叶绘世 Stable Diffusion 整合包技术解析与使用指南
  • Seedance 2.0:AI 视频生成新范式与开发者上手指南
  • 二分查找实战:x 的平方根与搜索插入位置解析
  • Windows 环境下 Python 结合 YOLO 实现图片分类检测
  • OpenClaw 跨平台安装指南:Windows 与 Ubuntu
  • C++ 二叉搜索树(BST)原理与完整实现
  • 基于腾讯云 HAI 与 DeepSeek 快速搭建个人网页
  • macOS Tahoe 26.2 更新详解:12 项关键改进与体验优化
  • SQL 高级查询技巧与预处理语句实战详解

相关免费在线工具

  • 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