spring中 方法上@Transation实现原理

Spring中@Transactional注解方法实现原理

Spring的@Transactional注解在方法级别实现事务管理的原理主要基于动态代理和拦截器机制,以下是其核心实现流程:

1. 代理创建阶段

当Spring容器启动时,会为带有@Transactional注解的类创建代理对象:

  1. Bean后处理器介入

    • InfrastructureAdvisorAutoProxyCreator识别需要事务管理的Bean

    • 对目标Bean创建AOP代理(JDK动态代理或CGLIB代理)

  2. 代理对象生成

    // 原始Bean
    public class UserServiceImpl implements UserService {@Transactionalpublic void createUser(User user) {// 业务逻辑}
    }// 生成的代理对象(伪代码)
    public class UserServiceProxy extends UserServiceImpl {private TransactionInterceptor txInterceptor;public void createUser(User user) {// 代理逻辑txInterceptor.invoke(new MethodInvocation() {// 包装原始方法调用});}
    }

2. 方法调用阶段

当调用代理对象的方法时,事务拦截器开始工作:

  1. 拦截器调用链

    客户端调用
    ↓
    Proxy.invoke()
    ↓
    TransactionInterceptor.invoke()
    ↓
    TransactionAspectSupport.invokeWithinTransaction()
  2. 事务准备流程

    protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation) throws Throwable {// 1. 获取事务属性(解析@Transactional注解)TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);// 2. 获取事务管理器PlatformTransactionManager tm = determineTransactionManager(txAttr);// 3. 根据传播行为决定事务操作TransactionStatus status = tm.getTransaction(txAttr);try {// 4. 执行原始方法Object result = invocation.proceedWithInvocation();// 5. 提交事务tm.commit(status);return result;} catch (Throwable ex) {// 6. 异常处理(决定是否回滚)completeTransactionAfterThrowing(txAttr, status, ex);throw ex;}
    }

3. 关键组件协作

组件作用
TransactionInterceptor方法调用的拦截器,包含核心事务逻辑
TransactionAttributeSource解析@Transactional注解属性
PlatformTransactionManager实际执行事务操作(begin/commit/rollback)
TransactionSynchronizationManager通过ThreadLocal管理事务上下文

4. 特殊场景处理

  1. 自调用问题

    public class OrderService {public void process() {this.updateOrder(); // 自调用不会经过代理,事务失效}@Transactionalpublic void updateOrder() {...}
    }

    解决方案:注入自身代理或拆分到不同类

  2. 异常回滚规则

    • 默认只对RuntimeExceptionError回滚

    • 可通过rollbackFor/noRollbackFor自定义

  3. 事务传播行为

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodA() {// 总是启动新事务
    }

5. 实现原理总结

  1. 代理机制:通过AOP创建代理对象包裹原始Bean

  2. 拦截处理:方法调用被TransactionInterceptor拦截

  3. 事务管理:根据注解属性执行事务开始/提交/回滚

  4. 线程绑定:使用ThreadLocal保持事务上下文一致性

  5. 资源协调:统一管理Connection等资源

这种设计实现了业务逻辑与事务管理的解耦,开发者只需通过注解声明事务需求,无需编写模板化的事务管理代码。

请再说下代理对象 事物拦截器,事物管理器之前关系及执行流程

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

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

相关文章

qt-C++语法笔记之Stretch与Spacer的关系分析

qt-C语法笔记之Stretch与Spacer的关系分析 code review! 文章目录qt-C语法笔记之Stretch与Spacer的关系分析1. Stretch&#xff08;拉伸因子&#xff09;2. Horizontal Spacer 和 Vertical Spacer3. Stretch 和 Spacer 的关系4. 实际应用中的选择5. 注意事项6. 代码与 Qt Desig…

Qwen3技术综述

1. 引入 2025年5月&#xff0c;qwen推出了旗舰模型&#xff08;flagship model&#xff09;Qwen3-235B-A22B。并以Apache 2.0版权发布&#xff08;可自由商业使用&#xff0c;修改代码和商用要包含原始版权&#xff09;。本文对其技术报告中提到的数据处理技术与模型结构进行综…

[特殊字符] Excel 读取收件人 + Outlook 批量发送带附件邮件 —— Python 自动化实战

许多公司定期需要将不同部门或客户的报告发送给指定人员。手动操作容易出错、耗时且繁琐。今天这篇文章教你如何利用 Python 实现&#xff1a; &#x1f9e9; 从 Excel 中读取“收件人 抄送人 附件文件路径”&#xff1b; &#x1f4e4; 使用 win32com.client 调用 Outlook …

多模态大语言模型arxiv论文略读(152)

VidComposition: Can MLLMs Analyze Compositions in Compiled Videos? ➡️ 论文标题&#xff1a;VidComposition: Can MLLMs Analyze Compositions in Compiled Videos? ➡️ 论文作者&#xff1a;Yunlong Tang, Junjia Guo, Hang Hua, Susan Liang, Mingqian Feng, Xinya…

基于AR和SLAM技术的商场智能导视系统技术原理详解

本文面对室内定位算法工程师、智慧商场系统开发者、对VR/AR应用开发感兴趣的技术人员&#xff0c;解决如何通过SLAMAR技术破解大型商场室内导航的空间认知壁垒&#xff0c;实现沉浸式导览&#xff0c;本文提供完整技术方案与代码实现。 如需获取商场智能导视系统解决方案请前往…

Debezium日常分享系列之:认识Debezium Operator

Debezium日常分享系列之&#xff1a;认识Debezium Operator什么是Debezium OperatorDebezium Operator 的工作原理Debezium Operator 的优点Debezium Operator 使用场景Debezium Operator 的关键组件部署Debezium OperatorDebezium Operator 的使用什么是Debezium Operator De…

POSIX信号量,环形队列

是一种进程间或线程间同步机制&#xff0c;用于控制多个线程/进程对共享资源的访问&#xff0c;避免并发冲突。可以看作是一个计数器&#xff0c;通过对计数器的操作&#xff08;PV操作&#xff09;实现同步P操作(原子性)&#xff1a;&#xff0d;&#xff0d;&#xff0c;将信…

Python Day6

浙大疏锦行 Python Day6 内容&#xff1a; 描述性统计&#xff08;可视化分析&#xff09;单特征可视化&#xff08;连续、离散&#xff09;特征与标签可视化特征与特征可视化 代码&#xff1a; # TODO: 描述性统计 import pandas as pd import numpy as np import seaborn…

ESP32与树莓派C++、Rust开发实战

C++语言在ESP32、树莓派实例 以下是关于C++语言在ESP32、树莓派等硬件设备上的开发实例汇总,涵盖常见应用场景和代码示例。 ESP32开发实例 LED控制(GPIO操作) 使用ESP32的GPIO控制LED灯,示例代码基于Arduino框架: #include <Arduino.h> const int ledPin = 2; …

Jedis 原生之道:Redis 命令 Java 实现指南(一)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Redis &#x1f4da;本系列文章为个人学习笔…

飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式

飞算 JavaAI 开发助手&#xff1a;深度学习驱动下的 Java 全链路智能开发新范式 文章目录飞算 JavaAI 开发助手&#xff1a;深度学习驱动下的 Java 全链路智能开发新范式前言飞算 JavaAI IDEA插件下载、注册、使用智能引导操作流程Java Chat智能工作流程操作流程智能问答操作流…

Spring Boot 核心特性与版本演进解析

深度解读自动配置原理、版本差异与 3.x 的颠覆性变革 一、Spring Boot 的核心理念与迭代主线 Spring Boot 用两大核心武器重构了 Java 开发范式&#xff1a; 嵌入式容器&#xff1a;终结了 “war 包 Tomcat 配置地狱”&#xff0c;让 java -jar 成为生产级部署的标准姿势自动…

React Tailwind css 大前端考试、问卷响应式模板

功能概述 基于 React 和 Tailwind CSS 开发的在线大前端知识考试系统。页面设计简洁美观&#xff0c;交互流畅&#xff0c;适合前端开发者、学习者进行自我测试和知识巩固。系统内置多道涵盖 React、CSS、JavaScript、HTTP 等前端核心知识点的题目&#xff0c;支持单选与多选题…

【前端】手写代码汇总

近期更新完&#xff0c;后面不定期更新&#xff0c;建议关注收藏点赞。 目录快排手写防抖节流数组扁平化&#xff08;要求使用 reduce 方法&#xff09;数组filter实现手写一个加载图片的函数 loadImage手写Promise then手写 Promise.All手写 Promise.race手写allsettled手写us…

基于MATLAB 的心电信号去噪

基于Matlab的心电信号去噪 generate.m , 3450 genR.m , 953 genU.m , 891 get_obs.m , 957 CHANGELOG , 11185 find_localobs.m , 2312 fmain.m , 2272

git branch -a 还有一些已经删除了的分支

如何处理已经删除的远程跟踪分支1、删除远程跟踪分支如果你确定某个远程跟踪分支不再需要&#xff0c;你可以使用 git branch -d -r 命令来删除它。例如&#xff0c;要删除名为 origin/test 的远程跟踪分支&#xff0c;你可以使用&#xff1a;git branch -d -r origin/test2、更…

软件反调试(4)- 基于IsDebuggerPresent的检测

反调原理 该检测方式使用 IsDebuggerPresent 或者 CheckRemoteDebuggerPresent 函数&#xff0c;这两个函数都是 kernel32.dll 中实现的 对于 IsDebuggerPresent 函数&#xff0c;如果返回值为 TRUE&#xff0c;那么表示当前进程在调试器上下文中运行 CheckRemoteDebuggerPrese…

翻译《The Old New Thing》- Windows 媒体目录中 onestop.mid 文件的故事

Whats the story of the onestop.mid file in the Media directory? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20130212-00/?p5263 如果你查看你的C:\Windows\Media文件夹&#xff0c;会发现一个名为onestop的MIDI文件。这个奇怪的小MIDI文件背后有什…

【方案】前端UI布局的绝技,响应式布局,多端适配

大家好&#xff0c;欢迎来到停止重构的频道。本期讨论网页UI布局。网页UI布局是前端开发中占比较多的部分&#xff0c;做完网页布局也就差不多完成了一半的工作。本期视频&#xff0c;我们不再讨论基础的UI布局。我们希望满足响应式布局&#xff0c;一份代码适配PC/平板/手机等…

【郑大二年级信安小学期】Day4上午:Bool盲注时间盲注堆叠查询post注入HTTP头部注入ua字段

目录 0 录制文件 1 SQL注入-布尔盲注 1.1 布尔盲注优缺点 1.2 先看一下第八关嗯页面特征 1.3 步骤 1.4 常用函数 1.5 判断是否字符型 1.6 判断闭合 1.7 查询库名 1.8 查询数据表 1.9 获取字段名 1.10 获取数据 1.11 布尔盲注缺陷 2 时间盲注 2.1 基础知识 2.2 判…