Spring @Transactional 自调用问题深度解析

Spring @Transactional 自调用问题深度解析

问题本质:自调用事务失效

当类内部的方法A调用同一个类的另一个带有@Transactional注解的方法B时,事务注解不会生效。这是因为Spring的事务管理是基于AOP代理实现的,而自调用会绕过代理机制。

原理分析

1. Spring事务实现机制

Spring事务是通过动态代理实现的,有两种方式:

  • JDK动态代理:基于接口
  • CGLIB代理:基于类继承
// 原始调用流程(期望的事务流程)
caller → 代理对象 → 目标对象.methodB()// 自调用时的实际流程
caller → 目标对象.methodA() → 目标对象.methodB() [绕过代理]

2. 自调用问题示例

@Service
public class OrderService {public void placeOrder(Order order) {// 自调用导致事务失效validateOrder(order);// 其他业务逻辑...}@Transactionalpublic void validateOrder(Order order) {// 数据库验证操作...}
}

解决方案

方案1:注入自身代理(推荐)

@Service
public class OrderService {@Autowiredprivate OrderService selfProxy; // 注入代理对象public void placeOrder(Order order) {selfProxy.validateOrder(order); // 通过代理调用}@Transactionalpublic void validateOrder(Order order) {// 事务生效}
}

方案2:重构代码结构

@Service
@RequiredArgsConstructor
public class OrderService {private final OrderValidator orderValidator;public void placeOrder(Order order) {orderValidator.validate(order);}
}@Service
class OrderValidator {@Transactionalpublic void validate(Order order) {// 事务操作}
}

方案3:使用AspectJ模式(编译时织入)

# application.properties
spring.aop.proxy-target-class=true
spring.aop.auto=false

技术深度:Spring事务代理机制

代理创建过程

  1. 容器启动时创建原始Bean
  2. 通过AbstractAutoProxyCreator创建代理
  3. @Transactional方法添加拦截器

事务拦截器调用栈

TransactionInterceptor.invoke()
→ MethodInvocation.proceed()
→ ReflectiveMethodInvocation.proceed()
→ 最终调用目标方法

生产环境最佳实践

  1. 统一事务边界

    @Service
    @Transactional // 类级别注解
    public class OrderService {public void placeOrder() {// 所有public方法都默认有事务}
    }
    
  2. 事务监控

    @Aspect
    @Component
    public class TransactionMonitor {@Around("@annotation(transactional)")public Object monitor(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {// 记录事务开始/结束}
    }
    
  3. 异常处理

    @Transactional(rollbackFor = {BusinessException.class, TechnicalException.class})
    public void process() {// 明确指定回滚异常类型
    }
    

常见误区

  1. 私有方法加注解

    @Transactional // 无效!
    private void internalMethod() {}
    
  2. final方法加注解

    @Transactional // CGLIB代理下无效!
    public final void finalMethod() {}
    
  3. 同类非事务方法调用事务方法

    public void methodA() {methodB(); // 事务失效
    }@Transactional
    public void methodB() {}
    

性能考量

  1. 代理创建会增加启动时间
  2. 每个事务方法调用都有拦截开销
  3. 长事务会占用数据库连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【爬虫工具】2025微博采集软件,根据搜索关键词批量爬帖子,突破50页限制!

文章目录 一、背景分析1.1 开发背景1.2 软件界面1.3 结果展示1.4 软件说明 二、主要技术2.1 模块分工2.2 部分代码 三、使用介绍3.0 填写cookie3.1 软件登录3.2 采集wb帖子 四、演示视频五、软件首发 本工具仅限学术交流使用,严格遵循相关法律法规,符合平…

java函数式接口与方法引用

函数式接口指的是,一个interface, 只含有一个抽象方法。函数式接口可以加上FunctionalInterface注解,加上这个注解后编译器会检查接口是否满足函数式接口的规范,不满足规范则直接编译不过。 典型的内置函数式接口有Runnable‌、…

uniapp开发04-scroll-view组件的简单案例

uniapp开发04-scroll-view组件的简单案例&#xff01;废话不多说&#xff0c;我们直接上代码分析。 <!--演示scroll-view组件效果--><scroll-view class"scroll" scroll-x><view class"group"><view class"item">111&l…

硬件须知的基本问题1

目录 1. 电路表示中的电压源表示符号有哪些&#xff1f; 2&#xff0e;查找电路表示中的电流源表示符号有哪些&#xff1f; 3&#xff0e;上拉电阻和下拉电阻的作用是什么&#xff1f; 4&#xff0e;0 欧姆电阻在电路中有什么作用&#xff1f; 5&#xff0e;电容的耦合…

Vue回调函数中的this

2025/4/25 向 示例 一个例子——计数器&#xff0c;通过this来操作数据。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

一键快速转换音频视频格式的实用工具

软件介绍 Sundy音视频格式转换工具&#xff0c;支持一键转换音频和视频格式&#xff0c;还可以集成至右键菜单&#xff0c;让操作更加便捷。软件支持MP4、FLV、AVI、MKV、MP3、FLAC等多种格式转换&#xff0c;用户可以根据需求自由选择。 直白版 Sundy音视频格式转换工…

【AI论文】Tina:通过LoRA的微小推理模型

摘要&#xff1a;如何在语言模型中实现成本效益高的强大推理能力&#xff1f; 在这个基本问题的驱动下&#xff0c;我们提出了Tina&#xff0c;这是一个以高成本效益实现的小型推理模型家族。 值得注意的是&#xff0c;Tina 证明了仅使用最少的资源就可以开发出大量的推理性能&…

TC3xx学习笔记-UCB BMHD使用详解(一)

文章目录 前言UCB BMHDPINDISHWCFGLSENA0-3LBISTENACHSWENABMHDIDSTADCRCBMHDCRCBMHD_NPW0-7 总结 前言 AURIX Tc系列Mcu启动过程&#xff0c;必须要了解BMHD&#xff0c;本文详细介绍BMHD的定义及使用过程 UCB BMHD UCB表示User Configuration Block,UCB是Dflash,存储的地址…

H.264/AVC标准主流开源编解码器编译说明

An artisan must first sharpen his tools if he is to do his work well. 工欲善其事,必先利其器. 前言 想研究和学习H.264/AVC视频编解码标准的入门的伙伴们,不论是学术研究还是工程应用都离不开对源码的分析,因此首要工作是对各类编解码器进行编译,本文针对主流的一些符…

Adobe Photoshop(PS)2022 版安装与下载教程

Adobe Photoshop下载安装和使用教程 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑和创造工作&#xff0c…

面试新收获-大模型学习

大模型原理 Transformer 架构与自注意力机制 Transformer 是当前大多数大模型采用的核心架构&#xff0c;由编码器-解码器组成&#xff0c;摒弃了传统 RNN 的顺序处理方式。Transformer 中关键在于多头自注意力机制&#xff08;Multi-Head Self-Attention&#xff09;&#xf…

华为OD机试真题——素数之积RSA加密算法(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式&#xff1b; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析&#xff1b; 本文收录于专栏&#xff1a;《2025华为OD真题目录…

精益数据分析(29/126):深入剖析电子商务商业模式

精益数据分析&#xff08;29/126&#xff09;&#xff1a;深入剖析电子商务商业模式 在创业和数据分析的学习道路上&#xff0c;我们始终在探索如何更精准地把握商业规律&#xff0c;提升业务的竞争力。今天&#xff0c;我们依旧怀揣着共同进步的愿望&#xff0c;深入解读《精…

大模型奖励建模新突破!Inference-Time Scaling for Generalist Reward Modeling

传统的RM在通用领域面临准确性和灵活性挑战&#xff0c;而DeepSeek-GRM通过动态生成principle和critic&#xff0c;结合并行采样与meta RM引导的投票机制&#xff0c;实现了更高质量的奖励信号生成。论文通过Self-Principled Critique Tuning (SPCT)方法&#xff0c;显著提升了…

机器视觉的胶带模切应用

在电子制造领域&#xff0c;胶带模切工艺如同产品的“隐形裁缝”&#xff0c;从手机屏幕OCA光学胶到动力电池绝缘胶带&#xff0c;每一刀精准的切割都关乎产品性能与可靠性。传统人工对位方式难以应对微米级加工精度的严苛要求&#xff0c;而MasterAlign机器视觉系统的引入&…

Vue2+ElementUI实现无限级菜单

使用Vue2和ElementUI实现无限级菜单,通常菜单数据以树形结构存储,每个菜单包含多个子菜单 ,子菜单又可以继续包含更深层次的子菜单项。所以,需要使用递归形式,完成子项菜单的渲染。 这里,结合Element UI界面的el-menu和el-submenu组件来构建菜单结构,有子菜单时使用el-s…

如何使用WebRTC

WebRTC比较容易使用&#xff0c;只需要很少的步骤&#xff0c;有些消息在浏览器和服务器之间流动&#xff0c;有些则直接在两个浏览器之间流动&#xff0c; 1、建立WebRTC会话 a&#xff1a;建立WebRTC连接需要加入以下几个步骤&#xff1a; 获取本地媒体&#xff1a;getUse…

数据分析管理软件 Minitab 22.2.2 中文版安装包 免费下载

Minitab22.2.2 安装包下载链接: https://pan.baidu.com/s/1cWuDbvcWhYrub01C6QR81Q?pwd6666 提取码: 6666 Minitab软件是现代质量管理统计软件&#xff0c;全球六西格玛实施的共同语言。Minitab 已经在全球120多个国家&#xff0c;5000多所高校被广泛使用。

从新手到高手:小程序开发进阶技巧分享

小程序开发从入门到精通需要经历技术积累、架构优化和工程化实践等多个阶段。以下是结合真实项目经验的进阶路线与核心技术要点&#xff0c;涵盖性能优化、架构设计、跨平台开发等关键领域&#xff1a; 一、性能调优实战技巧 1. 首屏渲染加速方案 // 预请求关键数据&#xff…

Vue3后代组件多祖先通讯设计方案

在 Vue3 中&#xff0c;当需要设计一个被多个祖先组件使用的后代组件的通讯方式时&#xff0c;可以采用以下方案&#xff08;根据场景优先级排序&#xff09;&#xff1a; 方案一&#xff1a;依赖注入&#xff08;Provide/Inject&#xff09; 响应式上下文 推荐场景&#xff…