当前位置: 首页 > news >正文

Spring事务注解@Transactional核心机制详解

您的描述可以更精确地总结为:@Transactional 注解的主要作用是声明式地定义一个事务边界,并利用 Spring 的 AOP(面向切面编程)机制,自动为该方法的执行包裹一个事务。这个事务会根据方法的执行结果(成功完成或抛出异常)来自动决定是提交还是回滚。

下面我为您详细解释一下这个过程,并补充一些重要的细节:

工作机制详解

  1. 代理与AOP

    • 当你在类或方法上添加 @Transactional 注解后,Spring 会在运行时为这个类创建一个代理(Proxy)对象。
    • 你调用的实际上是这个代理对象的方法,而不是原始对象的方法。
    • 代理对象会在调用你的业务方法之前开启事务,在方法执行结束后再根据情况提交或回滚事务
  2. 成功执行(提交)

    • 如果你的方法顺利执行完毕,没有抛出任何异常,代理逻辑会检测到这一点,然后提交事务。这意味着所有数据库操作(如INSERT, UPDATE, DELETE)将在此刻被永久保存。
  3. 出错/抛出异常(回滚)

    • 如果你的方法在执行过程中抛出了异常,代理逻辑会捕获到这个异常。
    • 默认情况下,只有在抛出运行时异常(RuntimeException)Error 时,Spring 才会回滚事务。这意味着所有在当前事务中执行的数据库操作都会被撤销,就像什么都没发生过一样。
    • checked exception(编译时异常,如IOException、SQLException),默认是不回滚的。

重要细节和高级配置

您的基础理解完全正确,但在实际使用中,还需要注意以下几点:

  1. 回滚规则的配置

    • 你可以通过注解的属性来精确控制回滚行为。
    • rollbackFor:指定遇到哪些异常时必须回滚。
    • noRollbackFor:指定遇到哪些异常时不回滚。
    // 遇到IOException异常也回滚(正常情况下遇到checked exception不回滚)
    @Transactional(rollbackFor = IOException.class)
    public void transferMoney() throws IOException {// ... 业务逻辑
    }// 遇到特定的运行时异常(如NullPointerException)时不回滚
    @Transactional(noRollbackFor = NullPointerException.class)
    public void updateProfile() {// ... 业务逻辑
    }
    
  2. 异常被捕获会导致不回滚

    • 这是一个非常常见的陷阱!如果你在方法内部try-catch捕获了异常并且没有重新抛出,Spring 的代理就感知不到异常,它会认为方法执行成功,从而提交事务
    @Transactional
    public void problematicMethod() {try {// 这里可能抛出异常someDatabaseOperation();} catch (Exception e) {// 你捕获了异常,但没有重新抛出!log.error("An error occurred", e);// 此时,事务依然会被提交!}
    }
    

    正确的做法是在catch块中抛出一个能触发回滚的异常(通常是RuntimeException)。

  3. 方法修饰符与自调用问题

    • @Transactional 注解应该只用于public方法。在protected, private 或 包可见方法上使用,注解将被忽略,不会创建事务。
    • 自调用问题:在同一个类中,一个没有注解的方法A调用另一个有@Transactional注解的方法B,事务是不会生效的。因为这绕过了Spring创建的代理对象,直接调用了原始对象的方法。

总结

场景事务结果说明
方法成功执行,无异常抛出提交所有数据库更改被永久保存。
方法抛出 RuntimeExceptionError回滚默认行为。所有数据库更改被撤销。
方法抛出 checked exception (如IOException)提交默认行为。如果需要回滚,必须使用 @Transactional(rollbackFor = MyCheckedException.class)
方法内部捕获异常,未重新抛出提交常见错误!Spring代理不知道发生了异常。

所以,若正确将自动帮我提交事务,若有出错则自动回滚事务”——是@Transactional注解设计的核心思想。Spring通过它极大地简化了传统需要手动编写begin transaction, commit, rollback代码的事务管理方式,让我们可以更专注于业务逻辑。


文章转载自:

http://VL5TvABU.cwnqd.cn
http://1uGDI1dm.cwnqd.cn
http://nx7UjBsr.cwnqd.cn
http://5vAZdqRd.cwnqd.cn
http://Z1OSBWp0.cwnqd.cn
http://2uJ0CUq6.cwnqd.cn
http://4T0GIM8j.cwnqd.cn
http://p9edx1TE.cwnqd.cn
http://6yl2Xgzp.cwnqd.cn
http://LJkE081D.cwnqd.cn
http://XrIaJZGJ.cwnqd.cn
http://jBWkzr07.cwnqd.cn
http://uDfPdSkw.cwnqd.cn
http://nWQYDP1p.cwnqd.cn
http://jWdD52FR.cwnqd.cn
http://kV8Ot1Re.cwnqd.cn
http://2wb4K4mu.cwnqd.cn
http://eKBKfUar.cwnqd.cn
http://T9fAXwHp.cwnqd.cn
http://5Xzn6GCh.cwnqd.cn
http://geJr73nr.cwnqd.cn
http://KJKG6yfN.cwnqd.cn
http://7bNZoFtC.cwnqd.cn
http://6iB3VJir.cwnqd.cn
http://sOU7dXmF.cwnqd.cn
http://y9rZ3t1x.cwnqd.cn
http://Yc1aaMLj.cwnqd.cn
http://YjKPSUO9.cwnqd.cn
http://VobvCHvm.cwnqd.cn
http://CWSujhaD.cwnqd.cn
http://www.dtcms.com/a/383364.html

相关文章:

  • [问题记录]刚下载的Qt,跑项目出现的问题
  • ACP笔记(二):大模型的问答工作流程及影响大模型内容生成的随机生成参数
  • 安卓学习 之 Activity的生明周期
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘pandas’ 问题
  • SPSS绘制ROC曲线并计算灵敏度、特异度
  • 健康的饮食习惯是什么样的
  • [Windows] 电脑清理软件 AppCleaner v3.3.6626.24371
  • Git版本控制工具+基础命令
  • 通用引用与重载的困境:Effective Modern C++ 条款27的技术总结
  • [数据结构总结篇]--线性表
  • 【Javaweb学习|实训总结|Week2】个人疑问记录、大模型API接入
  • srm招标采购询价供应商管理系统源码(java源码➕vue前端➕数据库操作文档➕软件文档)
  • 蚂蚁S19 Pro Hyd 184T矿机参数分析及其特点
  • Coze源码分析-资源库-创建知识库-基础设施/存储/安全
  • 国家标准项目管理专业人员五级划分解析
  • c++---map和set
  • Python可微分编程革命:JAX与PyTorch2.0的梯度计算架构剖析
  • 【Linux】人事档案——用户及组管理
  • JavaScript对象创建方式完全指南:从原始到现代的演进之路
  • 深入探讨 HarmonyOS 新一代声明式 UI:从 ArkTS 与 ArkUI 到高级应用实践
  • React组件通信的6种艺术:从单向传值到全局共享
  • Go 消息队列学习指南
  • 导购类电商平台的服务容错机制:Sentinel在微服务稳定性保障中的应用
  • 基于HTML2WEB和DEEPSEEK实现web设计
  • 网络系统设计方案: eNSP、华为、网络架构设计、小型局域网、DHCP\MSTP\VRRP\VLAN\RIP
  • 视觉 AI 如何优化产品图片分类?
  • Linux《线程(上)》
  • LeetCode 2565.最少得分子序列
  • Petalinux相关配置——ZYNQ通过eMMC启动
  • 2024版 IDEA 用 Maven 创建 java 项目(+Maven 安装和配置)