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

Spring 事务注解及传播机制详解

Spring 事务管理通过@Transactional 注解实现声明式事务控制。文章介绍了回滚规则默认针对运行时异常,可通过 rollbackFor 指定受检异常。隔离级别支持数据库默认及多种标准级别。重点讲解了七种事务传播行为,包括 REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER 和 NESTED,明确了各自在嵌套调用时的执行逻辑与事务边界。

GRACE Grace发布于 2026/2/6更新于 2026/9/467 浏览
Spring 事务注解及传播机制详解

1. 概述

Spring 事务管理是 Spring 框架中用于确保数据库操作原子性、一致性、隔离性和持久性 (ACID) 的核心机制。它通过声明式或编程式方式管理事务,支持多种事务传播行为和隔离级别。相较于编程式事务,声明式事务通过 @Transactional 注解实现事务管理,无需手动编写事务代码。

2. @Transactional

作用: 提供声明式事务管理。它简化了在应用程序中管理数据库事务的流程。开发者只需在方法或类上添加此注解,Spring 框架就会自动处理事务的开启、提交和回滚,无需手动编写事务管理代码 (如 begin、commit、rollback)。

级别: 类 + 方法。作为类注解:为类中所有 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

作用: 指定哪些异常触发回滚,默认情况下在抛出非受查异常 (RuntimeException)/错误 (Error) 时触发回滚。

指定回滚类型

@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 "注册成功";
}

此时即使抛出受检异常,由于配置了 rollbackFor,事务也会回滚。

抛出非受查异常时

@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 "注册成功";
}

默认行为下,抛出 RuntimeException 会触发回滚。

抛出受查异常时

@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 "注册成功";
}

默认情况下,抛出受检异常 (IOException) 不会触发回滚,除非显式配置。

2.2 isolation

作用: 用于指定事务的隔离级别。

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

2.3 propagation

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

2.3.1 Propagation.REQUIRED

默认传播行为。如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务。

2.3.2 Propagation.SUPPORTS

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

2.3.3 Propagation.MANDATORY

强制要求当前存在事务并加入,否则抛出异常。

2.3.4 Propagation.REQUIRES_NEW

无论当前是否存在事务,都新建一个事务。新事务与当前事务独立,互不干扰。

2.3.5 Propagation.NOT_SUPPORTED

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

2.3.6 Propagation.NEVER

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

2.3.7 Propagation.NESTED

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

目录

  1. 1. 概述
  2. 2. @Transactional
  3. 2.1 rollbackFor
  4. 2.2 isolation
  5. 2.3 propagation
  6. 2.3.1 Propagation.REQUIRED
  7. 2.3.2 Propagation.SUPPORTS
  8. 2.3.3 Propagation.MANDATORY
  9. 2.3.4 Propagation.REQUIRES_NEW
  10. 2.3.5 Propagation.NOT_SUPPORTED
  11. 2.3.6 Propagation.NEVER
  12. 2.3.7 Propagation.NESTED

更多推荐文章

查看全部
  • Fish Speech-1.5 多语种语音合成:中英混合文本发音处理技巧
  • Docker Registry 私有仓库搭建实战 (v1/v2 详解)
  • C++ 操作 Redis 指南:redis-plus-plus 库使用
  • Stable Diffusion 的三款主流替代方案
  • SpringBoot 新版本特性演进:2.1 至 3.1 核心变更
  • 通义万相 2.1 图生视频技术简介与开源资源获取
  • 前端实现液态玻璃效果
  • 基于 SpringBoot+Vue 的高校一卡通管理系统设计与实现
  • 动态规划:排列与组合的区别解析
  • 华为 OD 机试双机位 C 卷 - 面试叫号系统
  • 前端代码质量保证指南:提升可靠性与可维护性
  • 动态规划:子数组与子串问题
  • 基于 SpringBoot 与 Vue 的 Web 咖啡点单系统设计
  • C++26 任务优先级队列内部机制解析
  • C++11 核心新特性详解:初始化、声明与移动语义
  • 基于 STM32 的智能家居安防系统设计与实现
  • 车载 AR-HUD 在不同光照条件下的颜色可见性评估
  • 未来三年职场涨薪趋势分析与应对建议
  • AI 中转 API 原理揭秘:低价背后的机制与风险
  • Windows 系统提示找不到文件 javaw.exe 的解决方案

相关免费在线工具

  • 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