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

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

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

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

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

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

更多推荐文章

查看全部
  • Ubuntu 24.04 国内镜像源配置及一键脚本(含清华/阿里云/163 源)
  • openGauss 在向量数据库与 RAG 场景下的应用深度研究
  • Shell 脚本封装 Curl 请求及响应码校验
  • LangChain4j 集成 Spring Boot 完整教程
  • Python 环境下 Gurobi 安装与配置指南
  • Cursor Chat 三大模式:Agent、Ask、Plan 解析
  • 国内环境部署 OpenClaw 个人 AI 助手指南
  • 2024 年大模型学习路线:从数学基础到微调实战
  • AR 健身教练“形随心动”:基于 Rokid CXR-M SDK 的实践落地
  • C++ 面试高频考点与核心技术解析
  • Stable Diffusion v1.5 跨文化风格生成实战:浮世绘、拜占庭与非洲图腾
  • 基于 Z-Image 与 ComfyUI 的国产 AIGC 图像生成生态构建
  • Codex 与 Copilot:AI 编程助手的本质与区别
  • C++ 笔试刷题 Day 16:字符串替换、神奇数及 DNA 序列
  • 绿豆 UI9 源码支持 Python 线路与弹幕解析功能介绍
  • Kali Linux 下 Docker 及 docker-compose 安装配置
  • CANN Catlass 模板库核心能力与编程实战
  • 基于 Spring Cloud 构建分布式智能推荐系统实战
  • STM32 移植 LVGL8.3 图文教程
  • Tomcat 安装、环境配置及 IDE 集成指南

相关免费在线工具

  • 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