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

Spring 事务及其传播机制详解

综述由AI生成Spring 框架中的事务管理机制。重点讲解了声明式事务注解@Transactional 的使用方法,包括类级别和方法级别的配置。详细说明了回滚规则(rollbackFor),默认仅对运行时异常回滚,可通过配置指定受检异常触发回滚。阐述了事务隔离级别(Isolation)的选项及其含义。深入分析了七种事务传播行为(Propagation),如 REQUIRED、REQUIRES_NEW、NESTED 等,解释了在不同事务场景下的执行逻辑和回滚影响。内容旨在帮助开发者理解并正确配置 Spring 事务。

字节跳动发布于 2026/3/30更新于 2026/5/2427 浏览
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 "注册成功";
    }
}

执行 PostMan 请求后,若业务逻辑正常,MySQL 事务提交,后端日志记录成功信息。

2.1 rollbackfor

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

指定回滚类型

@RequestMapping("/test")
@RestController
@Slf4j
public class TestController {
    private final UserService userService;

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

    @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 = Exception.class,事务依然会回滚。

抛出非受查异常时

@RequestMapping("/test")
@RestController
@Slf4j
public class TestController {
    private final UserService userService;

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

    @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,默认触发回滚。

抛出受查异常时

@RequestMapping("/test")
@RestController
@Slf4j
public class TestController {
    private final UserService userService;

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

    @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,默认不触发回滚(除非配置 rollbackFor)。

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
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 企业级大模型构建:知识库核心与落地实践
  • .NET 集成 GoView 低代码可视化大屏方案详解
  • ROS C++ 程序编译与运行流程
  • Claude AI 注册流程解析与手机号验证解决方案
  • Python 数据分析入门:理解集中趋势与离散程度
  • Web1.0 到 Web3.0:互联网三次进化解析
  • OpenClaw Java:基于 Spring Boot 的 AI Agent Gateway 全栈实践
  • ABB 机器人虚拟示教器基础操作教程
  • 数据结构初阶之单链表实现
  • FPGA 商用级 ISP:动态坏点校正 DPCC 的滑窗架构与并行判决实现
  • AI 赋能生物信息学:加速基因组分析实战
  • C++ 实现类似 Java 的 Stream API
  • C++ STL String 类模拟实现详解
  • Kimi Code 深度体验:从 CLI 到 IDE 的 AI 编程实践
  • 大疆 MSDK 无人机视觉引导自适应降落方案
  • 从前序和中序遍历重建二叉树:C++ 递归与哈希表解析
  • Python 图像文字艺术:用代码生成专属表白图
  • 绿盟校招 C++ 研发工程师一面面试复盘
  • Python 与 PyCharm 环境搭建完整指南
  • 钉钉 Webhook 完全指南

相关免费在线工具

  • 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