news 2026/7/9 15:39:47

在 Spring 中,当你在方法上使用 @Transactional 注解时,事务的开启、数据库操作的执行以及事务的提交/回滚,遵循的流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 Spring 中,当你在方法上使用 @Transactional 注解时,事务的开启、数据库操作的执行以及事务的提交/回滚,遵循的流程

在 Spring 中,当你在方法上使用@Transactional注解时,事务的开启、数据库操作的执行以及事务的提交/回滚,遵循以下流程


✅ 正确的执行顺序是:

  1. 方法调用前:Spring 通过代理机制开启数据库事务(即向数据库发送BEGIN或类似指令);
  2. 方法执行中:你的业务代码(包括对数据库的操作,如INSERTUPDATE等)会立即执行并写入数据库,但这些更改处于“未提交”状态(对其他事务不可见,取决于隔离级别);
  3. 方法执行成功结束后:Spring提交事务(发送COMMIT),此时数据才真正持久化并对其他事务可见;
  4. 方法抛出异常且满足回滚条件时:Spring回滚事务(发送ROLLBACK),所有在该方法中执行的数据库操作全部撤销。

📌 关键澄清:

不是“等方法执行完才进库”
而是“方法执行过程中就进库了,但未提交;方法成功结束才提交”

也就是说:

  • 数据库的写操作(如 INSERT)在方法内部执行时就已经发给数据库了
  • 但由于事务未提交,这些数据处于“临时”状态(在 InnoDB 等支持事务的引擎中,会记录在 Undo Log 中);
  • 只有事务提交后,这些更改才对外生效。

🔍 举个例子:

@Transactional public void transfer(Long from, Long to, BigDecimal amount) { accountDao.deduct(from, amount); // ← 这行执行时,SQL 已发给数据库,但未 COMMIT accountDao.add(to, amount); // ← 同上 // 如果这里抛出 RuntimeException if (amount.compareTo(BigDecimal.ZERO) <= 0) { throw new IllegalArgumentException("金额必须大于0"); } }
  • 假设deductadd都执行成功,但在最后检查时抛出异常;
  • 那么两个 SQL 虽然都已执行,但会被回滚,数据库最终无变化;
  • 如果没有异常,方法正常结束,Spring 才执行COMMIT,数据正式落盘。

⚠️ 注意事项:

  1. 事务由 Spring 代理控制
    事务的开启和提交是由 Spring 的 AOP 代理在方法调用前后自动插入的逻辑完成的 。
  2. 数据库必须支持事务
    如 MySQL 的 InnoDB 引擎。MyISAM 不支持事务,即使加了@Transactional也无效。
  3. 只对 public 方法有效
    因为 Spring 默认使用代理模式,非 public 方法无法被代理拦截 。
  4. 默认只对 RuntimeException 回滚
    检查型异常(如IOException)不会触发回滚,除非显式配置rollbackFor

✅ 总结:

表格

阶段行为
方法开始前Spring 开启事务(BEGIN
方法执行中SQL 语句立即执行,但处于未提交状态
方法成功结束Spring 提交事务(COMMIT)→ 数据真正入库
方法抛出异常Spring 回滚事务(ROLLBACK)→ 数据撤销

所以答案是:先进库(执行 SQL),但不提交;等方法执行完再决定提交或回滚

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 16:24:12

完整HandheldCompanion使用手册 - 从零开始掌握手柄伴侣

完整HandheldCompanion使用手册 - 从零开始掌握手柄伴侣 【免费下载链接】HandheldCompanion ControllerService 项目地址: https://gitcode.com/gh_mirrors/ha/HandheldCompanion HandheldCompanion是一款专为Windows手持设备设计的游戏控制器增强软件&#xff0c;能够…

作者头像 李华
网站建设 2026/7/4 20:48:44

深度技术解析:d2s-editor如何重构暗黑2存档编辑体验

深度技术解析&#xff1a;d2s-editor如何重构暗黑2存档编辑体验 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 在暗黑破坏神2单机游戏生态中&#xff0c;玩家长期面临着存档数据难以精准修改、稀有装备获取困难、角色属性无法灵…

作者头像 李华
网站建设 2026/7/1 13:47:14

AI手势控制开发:MediaPipe Hands案例详解

AI手势控制开发&#xff1a;MediaPipe Hands案例详解 1. 引言&#xff1a;AI 手势识别与追踪 随着人机交互技术的不断演进&#xff0c;非接触式控制正逐步从科幻走向现实。在智能家居、虚拟现实、远程会议等场景中&#xff0c;用户期望通过更自然的方式与设备互动——而“用手…

作者头像 李华
网站建设 2026/7/1 8:49:16

终极拓扑图工具:easy-topo让网络可视化变得简单高效

终极拓扑图工具&#xff1a;easy-topo让网络可视化变得简单高效 【免费下载链接】easy-topo vuesvgelement-ui 快捷画出网络拓扑图 项目地址: https://gitcode.com/gh_mirrors/ea/easy-topo 在网络架构设计和系统可视化领域&#xff0c;拓扑图工具已经成为不可或缺的专业…

作者头像 李华
网站建设 2026/7/1 8:49:16

暗黑2存档编辑神器:5分钟掌握d2s-editor完整使用指南

暗黑2存档编辑神器&#xff1a;5分钟掌握d2s-editor完整使用指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 作为暗黑破坏神2单机玩家的必备工具&#xff0c;d2s-editor暗黑2存档编辑器凭借其专业的功能和直观的操作界面&am…

作者头像 李华
网站建设 2026/7/1 8:49:17

区块链智能合约对接全流程解析(从开发到部署的黄金法则)

第一章&#xff1a;区块链智能合约对接全流程解析&#xff08;从开发到部署的黄金法则&#xff09;在构建去中心化应用的过程中&#xff0c;智能合约是核心组件。其对接流程涵盖从编写、测试到部署与交互的完整生命周期&#xff0c;遵循标准化操作可显著提升安全性与效率。开发…

作者头像 李华