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

Spring Boot 事务管理详解

详细介绍 Spring Boot 中的事务管理机制,涵盖声明式与编程式事务配置、事务传播行为(如 REQUIRED、NESTED 等)、隔离级别、回滚条件及常见失效场景。通过示例代码和图解,帮助开发者理解@Transactional 注解的使用规范,确保数据一致性与完整性。

DevOpsTeam发布于 2026/3/28更新于 2026/6/538 浏览

Spring Boot 事务管理详解

引言

在现代应用程序中,事务管理是确保数据一致性和完整性的重要机制。Spring Boot 提供了强大的事务管理功能,使得开发者可以轻松地定义和管理事务。本文将详细介绍 Spring Boot 中的事务管理,包括事务传播行为、事务属性以及声明式和编程式事务管理。

声明式事务管理

声明式事务管理是通过注解的方式来管理事务,最常用的注解是 @Transactional。这种方式简单直观,适合大多数场景。

示例
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Transactional
    public void createUser(User user) {
        // 数据库操作
    }
}

编程式事务管理

编程式事务管理是通过编程的方式来手动控制事务,通常使用 PlatformTransactionManager 和 TransactionTemplate。

示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

@Service
public class UserService {
    @Autowired
    private PlatformTransactionManager transactionManager;

    public void createUser(User user) {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setName("createUserTransaction");
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // 数据库操作
            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
    }
}

事务传播行为

事务传播行为定义了当一个事务方法调用另一个事务方法时,事务如何传播。Spring 提供了多种传播行为,可以通过 @Transactional 注解进行配置。以下是 Spring 支持的传播行为及其使用场景:

1. REQUIRED

定义:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

使用场景:大多数业务操作都使用该传播行为,因为它确保了调用链上的所有操作都在同一个事务中。

示例:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 B |
|        |----------->|
| 传播事务 T1 | +--------+
+--------+ +--------+
2. SUPPORTS

定义:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

使用场景:适用于可选的事务操作,例如只读查询。

示例:

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 B |
|        |----------->|
| 传播事务 T1 | +--------+
+--------+ +--------+
3. MANDATORY

定义:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

使用场景:用于强制要求在事务环境中执行的方法。

示例:

@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 C |
|        |----------->|
| 传播事务 T1 | +--------+
+--------+ +--------+
4. REQUIRES_NEW

定义:创建一个新的事务,如果当前存在事务,则将当前事务挂起。

使用场景:适用于必须在一个新事务中执行的操作,例如独立的日志记录。

示例:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 D |
|        |------------->|
| 挂起事务 T1 | 创建事务 T2 |
+--------+ +--------+
5. NOT_SUPPORTED

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

使用场景:适用于不需要事务的操作,例如批量数据处理。

示例:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 E |
|        |------------->|
| 挂起事务 T1 | 非事务执行 |
+--------+ +--------+
6. NEVER

定义:以非事务方式执行,如果当前存在事务,则抛出异常。

使用场景:用于强制要求以非事务方式执行的方法。

示例:

@Transactional(propagation = Propagation.NEVER)
public void methodF() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 F |
|        |------------->|
|        | 如果存在事务 T1,抛异常 |
+--------+ +--------+
7. NESTED

定义:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则行为与 REQUIRED 类似。

使用场景:适用于需要在主事务中执行的子事务,例如复杂的数据库操作。

示例:

@Transactional(propagation = Propagation.NESTED)
public void methodG() {
    // 业务逻辑
}

事务传播示意图:

+--------+ +--------+
| 方法 A | | 方法 G |
|        |------------->|
| 事务 T1 | 嵌套事务 T1.1 |
+--------+ +--------+

事务失效情况

Spring Boot 通过 Spring 框架的事务管理模块来支持事务操作。事务管理在 Spring Boot 中通常是通过 @Transactional 注解来实现的。以下是一些常见的事务失效情况:

1. 未捕获异常

如果一个事务方法中发生了未捕获的异常,并且异常未被处理或传播到事务边界之外,那么事务会失效,所有的数据库操作会回滚。

2. 非受检异常

默认情况下,Spring 对非受检异常(RuntimeException 或其子类)进行回滚处理,这意味着当事务方法中抛出这些异常时,事务会回滚。

3. 事务传播属性设置不当

如果在多个事务之间存在事务嵌套,且事务传播属性配置不正确,可能导致事务失效。特别是在方法内部调用有 @Transactional 注解的方法时要特别注意。

4. 多数据源的事务管理

如果在使用多数据源时,事务管理没有正确配置或者存在多个 @Transactional 注解时,可能会导致事务失效。

5. 跨方法调用事务问题

如果一个事务方法内部调用另一个方法,而这个被调用的方法没有 @Transactional 注解,这种情况下外层事务可能会失效。

6. 事务在非公开方法中失效

如果 @Transactional 注解标注在私有方法上或者非 public 方法上,事务也会失效。

7. 使用 this 调用事务方法

Spring 事务是通过代理对象来控制的,只有通过代理对象的方法调用才会应用事务管理的相关规则。当使用 this 直接调用时,是绕过了 Spring 的代理机制,因此不会应用事务设置。

回滚条件

1. 自动回滚事务
  • 抛出未检查异常(RuntimeException 及其子类),例如:NullPointerException 等。
2. 不会自动回滚
  • 默认情况下,检查异常(如 IOException、SQLException 等)不会触发回滚。可以通过 @Transactional 注解的 rollbackFor 属性配置回滚:

示例:

@Transactional(rollbackFor = IOException.class)
public void methodH() {
    // 业务逻辑
}

事务属性

除了传播行为,Spring 还提供了一些其他事务属性,可以通过 @Transactional 注解进行配置。

1. 隔离级别

隔离级别定义了一个事务与其他事务隔离的程度。Spring 支持以下几种隔离级别:

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

示例:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void methodI() {
    // 业务逻辑
}
2. 事务超时

事务超时定义了事务在回滚之前可以运行的最长时间(以秒为单位)。

示例:

@Transactional(timeout = 30)
public void methodJ() {
    // 业务逻辑
}
3. 只读事务

只读事务用于优化只读操作。设置为只读的事务可以提示数据库引擎进行某些优化。

示例:

@Transactional(readOnly = true)
public void methodK() {
    // 业务逻辑
}
4. 回滚规则

通过 rollbackFor 和 noRollbackFor 属性可以指定哪些异常会触发事务回滚,哪些不会。

示例:

@Transactional(rollbackFor = Exception.class)
public void methodL() {
    // 业务逻辑
}

常见面试题解析

1. 什么是事务传播行为?Spring 提供了哪些事务传播行为?

答:事务传播行为定义了当一个事务方法调用另一个事务方法时,事务如何传播。Spring 提供了以下事务传播行为:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。

2. 如何配置事务的隔离级别?Spring 提供了哪些隔离级别?

答:可以通过 @Transactional 注解的 isolation 属性配置事务的隔离级别。Spring 提供了以下隔离级别:DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。

3. 什么是只读事务?如何配置?

答:只读事务用于优化只读操作。可以通过 @Transactional 注解的 readOnly 属性配置只读事务。例如:@Transactional(readOnly = true)。

4. 如何配置事务的超时时间?

答:可以通过 @Transactional 注解的 timeout 属性配置事务的超时时间(以秒为单位)。例如:@Transactional(timeout = 30)。

5. 如何指定哪些异常会触发事务回滚?

答:可以通过 @Transactional 注解的 rollbackFor 属性指定哪些异常会触发事务回滚。例如:@Transactional(rollbackFor = Exception.class)。

总结

Spring Boot 提供了强大的事务管理功能,通过 @Transactional 注解可以方便地配置事务的传播行为和属性。理解和合理应用这些配置,可以有效地提高应用程序的数据一致性和完整性。

目录

  1. Spring Boot 事务管理详解
  2. 引言
  3. 声明式事务管理
  4. 示例
  5. 编程式事务管理
  6. 示例
  7. 事务传播行为
  8. 1. REQUIRED
  9. 2. SUPPORTS
  10. 3. MANDATORY
  11. 4. REQUIRES_NEW
  12. 5. NOT_SUPPORTED
  13. 6. NEVER
  14. 7. NESTED
  15. 事务失效情况
  16. 1. 未捕获异常
  17. 2. 非受检异常
  18. 3. 事务传播属性设置不当
  19. 4. 多数据源的事务管理
  20. 5. 跨方法调用事务问题
  21. 6. 事务在非公开方法中失效
  22. 7. 使用 this 调用事务方法
  23. 回滚条件
  24. 1. 自动回滚事务
  25. 2. 不会自动回滚
  26. 事务属性
  27. 1. 隔离级别
  28. 2. 事务超时
  29. 3. 只读事务
  30. 4. 回滚规则
  31. 常见面试题解析
  32. 1. 什么是事务传播行为?Spring 提供了哪些事务传播行为?
  33. 2. 如何配置事务的隔离级别?Spring 提供了哪些隔离级别?
  34. 3. 什么是只读事务?如何配置?
  35. 4. 如何配置事务的超时时间?
  36. 5. 如何指定哪些异常会触发事务回滚?
  37. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ explicit 关键字详解
  • Harness Engineering:给 AI 套上缰绳的工程学
  • ComfyUI 节点式工作流实战:从零搭建 AI 绘画流程及 SDXL 配置
  • Qwen3+Qwen Agent 智能体开发实战:接入 MCP 工具详解
  • C++ 模板与 string 类使用指南
  • ROS2 机器人 URDF 建模指南
  • WorkBuddy 安装与使用指南:腾讯 AI 原生桌面智能体工作台
  • 基于视觉的增强现实特效技术详解
  • AI 绘画关键词网站效率提升实战:从数据预处理到模型加速
  • Python 数学建模基础语法与常用库应用指南
  • Python HTTP 请求库对比:requests、aiohttp 与 httpx
  • 阿里 Android 面试复盘:Java 基础、计算机原理与项目经验总结
  • AnythingLLM:零成本搭建私人 ChatGPT,支持主流大模型
  • iOS TabBar 背景透明设置方法
  • 小米推出手机端智能体应用 MiClaw,重构智能家居底层逻辑
  • MetaAPP 前端一面面经:Vue 原理、CSS 动画与 JS 特性解析
  • AI 代码助手(GitHub Copilot)如何改变开发者工作流
  • C++微服务 UserServer 设计与实现
  • 大语言模型框架-Megatron-LM 源码分析
  • APP 测试要点总结

相关免费在线工具

  • 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