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

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

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

邪神洛基发布于 2026/3/28更新于 2026/6/217 浏览
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折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Java 多态与动态绑定核心解析
  • Java String 核心机制与常用 API 实战
  • 基于 Spring Boot 的 WebSocket 服务示例
  • GitHub Copilot 安装与使用指南:AI 辅助编程助手
  • DeepSeek-R1 大模型基于 MS-Swift 框架部署、推理与微调实践
  • 自然语言处理在客户服务领域的应用与实战
  • 软件正交架构的设计原则与核心优势
  • Java 并发编程核心:CompletableFuture 实战与原理解析
  • 语义化 AI 驱动器:提示词工程演进与未来技术架构
  • Qt 多线程开发:QThread 核心用法与示例
  • 鸿蒙6系统运行自研 APK 应用指南
  • Spring Boot 日志全方位指南:从入门到高级配置
  • Z-Image-Turbo 孙珍妮模型云端部署与提示词实战
  • C# 日期处理实战:计算周范围与周数
  • Python 面向对象编程入门:初识对象
  • 前端三年职业回顾:理想与现实的碰撞
  • 预训练语言模型与 BERT 实战应用
  • Ladybird 独立浏览器架构与 Web 引擎技术介绍
  • Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测
  • OpenClaw 机器人本地部署与配置实战

相关免费在线工具

  • 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