SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

news2024/11/19 7:45:18

首先,如果在某个类或某个方法被标记为@Transactional时,Spring boot底层会在创建这个bean时生成代理对象(默认使用cglib)
示例:
在这里插入图片描述
在这里插入图片描述
当调用studentService的addStudent方法时,会直接跳到CglibAopProxy类去执行intercept方法(因为studentService是使用cglib生成的代理对象)
在这里插入图片描述
当执行

List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

到这句时,chain里就是Spring Boot在生成代理对象时配置的Advisor,实际就是一个TransactionInterceptor.接着往下执行,到

retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();

将进入CglibAopProxy类,如下图proceed方法
在这里插入图片描述
它将调用父类ReflectiveMethodInvocation的proceed方法,
在这里插入图片描述
执行到最下边return那行时,会进入TransactionInterceptor的invoke方法,代码如下:
在这里插入图片描述
可以看到调用了invokeWithinTransaction方法,代码如下图所示
在这里插入图片描述
invocationTransaction代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中createTransactionIfNecessary用来开启事务,commitTransactionAfterReturning用来提交事务,
retVal = invocation.proceedWithinTransaction用来执行业务代码
执行invocation.proceedWithinTransaction会回到TransactionInterceptor类:
在这里插入图片描述
执行invocation.proceed,回到CgligApoProxy类:
在这里插入图片描述
调用super.proceed回到父类ReflectiveInvocationMethodInvocation,
在这里插入图片描述
如上图,这次将执行invokeJoinpoint方法,也就是我们自己定义的业务方法,invokeJoinpoint代码如下:
在这里插入图片描述
从上图可以看到,通过反射的方式调用了我们自己定义的业务方法,然后返回到ReflectiveMethodInvocation类:
在这里插入图片描述
继续返回到CglibAopProxy类:
在这里插入图片描述
继续返回TransactionInterceptor类的invoke方法:
在这里插入图片描述
继续返回,
在这里插入图片描述
retVal拿到了业务方法调用的结果,然后调用commitTransactionAfterReturning,将事务提交,整个流程结束

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

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

相关文章

vscode里配置C#环境并运行.cs文件

vscode是一款跨平台、轻量级、开源的IDE, 支持C、C、Java、C#、R、Python、Go、Nodejs等多种语言的开发和调试。下面介绍在vscode里配置C#环境。这里以配置.Net SDK v5.0&#xff0c;语言版本为C#9.0&#xff0c;对应的开发平台为VS2019&#xff0c;作为案例说明。 1、下载vsc…

vue3小知识点汇总——基础积累

下面的小知识点比较零散&#xff0c;但是脑子不太好使&#xff0c;只能先记录一下啦&#xff0c;后面知识丰富起来后&#xff0c;慢慢就懂了。 1.最新版node.js已经不兼容vue2的项目了&#xff0c;学习vue3势在必行 node.js的安装及vue的搭建详细步骤&#xff1a;http://t.cs…

比特币暴跌的4个原因

作者&#xff1a;秦晋 加密市场每隔一段时间&#xff0c;就会迎来一次「暴跌」&#xff0c;而且每次暴跌原因各不相同。但归根到底都是「恐慌情绪」在作怪。继「312暴跌」、「519暴跌」之后&#xff0c;又迎来一个「8.18暴跌」。相比前两次暴跌&#xff0c;此次暴跌的原因或许略…

想做赴日程序员 有一定技术经验不学日语可以赴日IT吗?

有的小伙伴问&#xff1a;我有一定的IT技术和经验&#xff0c;不学日语的话&#xff0c;能去做赴日IT工作吗&#xff1f;说实话啊&#xff0c;我感觉如果行的话&#xff0c;那只能说明你运气不错&#xff0c;因为日本的IT行业在日本来说&#xff0c;并不是非常高薪的行业&#…

Redis中的有序集合

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合&#xff0c;他底层是使用压缩列表和跳表实现的&#xff0c;和Java中的HashMap底层数据结构&#xff08;1.8&#xff09;链表红黑树异曲同工之妙…

【深入了解PyTorch】PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析

【深入了解PyTorch】PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析 PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析项目一:图像分类数据集准备构建模型训练模型模型评估和预测项目二:目标检测数据集准备构建模型训练模型模型评估和预测项目三:情…

记录因暴露阿里最高权限的Accesskey和secretKey导致的反弹shell攻击过程

Accesskey和SecretKey的泄露的原因 说到这个最高权限的key的泄露&#xff0c;绝对是低级的设计导致的。为了减少服务端的压力&#xff0c;直接让app直连oss服务&#xff0c;而且把最高权限的Accesskey和secretKey 下发到客户端&#xff0c;那么结果就是只要安装了该app的人&am…

js判断用户当前网络状态和判断网速

前端判断用户当前网络状态和判断网速 一、第一种是通过 HTML5 提供的 navigator 去检测网络(1)、原理介绍:(2)、兼容性 二、监听window.ononline和window.onoffline事件:三、通过ajax进行请求判断(兼容性好-推荐)(1)、原理介绍:(2)、注意: 四、navigator.connection方法监听网络…

PP-TS基于启发式搜索和集成方法的时序预测模型,使预测更加准确

时间序列数据在各行业和领域中无处不在&#xff0c;如物联网传感器的测量结果、每小时的销售额业绩、金融领域的股票价格等等&#xff0c;都是时间序列数据的例子。时间序列预测就是运用历史的多维数据进行统计分析&#xff0c;推测出事物未来的发展趋势。 为加快企业智能化转型…

Vue elementui 实现表格selection的默认勾选,翻页记录勾选状态

需求&#xff1a;当弹出一个列表页数据&#xff0c;对其进行筛选选择。 列表更新&#xff0c;填充已选数据 主要使用toggleRowSelection 代码如下&#xff1a; <el-table v-loading"loading" :data"drugList" selection-change"handleSelection…

安卓手机跑 vins slam (1)

一直是手机拍照&#xff0c;用RealityCapture重建三维模型。因为他是靠特征点去把拍摄的多个图像进行对齐的。需要拍摄的足够多&#xff0c;且有特征才能对齐&#xff0c;要不然会生成多个组件&#xff0c;还得手动拼。 而且重建的三维模型有尺度问题&#xff0c;自动重建的模…

四、内存管理

1、为什么需要自己实现内存管理 (1)RTOS涉及的内核对象&#xff1a;task、queue、semaphores和event group等。为了让FreeRTOS更容 易使用&#xff0c;这些内核对象一般都是动态分配&#xff1a;用到时分配&#xff0c;不使用时释放。使用内存的动态管理功能&#xff0c;简化了…

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…

Unity导入google.protobuf失败,无法找到google命名空间

问题&#xff1a; 1.刚开始把protobuf的文件夹直接从其他项目里(unity2021)里复制到unity(2020)版本&#xff0c;当时报错protobuf.dll的依赖项system.memory版本不对。 2.没有使用原来的protobuf文件了。使用vs2019的NuGet管理包来下载Google.Protobuf &#xff0c;仍然报错找…

爬虫学得好,然后呢?最新Python人工智能就业班课程

课程链接&#xff1a; 私信&#xff1a;达内 课程介绍&#xff1a; 【达内最新Python人工智能就业班课程目录】 &#x1f4da; 1. Python核心 &#x1f9e0; 2. 面向对象程序设计 &#x1f52e; 3. Python高级 &#x1f4bb; 4. 阶段项目实战 &#x1f427; 5. Linux操作系…

PHP海外代购管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 海外代购管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88229435 论文 https://…

python的全局解释锁(GIL)

一、介绍 全局解释锁&#xff08;Global Interpreter Lock&#xff0c;GIL&#xff09;是在某些编程语言的解释器中使用的一种机制。在Python中&#xff0c;GIL是为了保证解释器线程安全而引入的。 GIL的作用是在解释器的执行过程中&#xff0c;确保同一时间只有一个线程可以…

win11安装ubuntu 子系统安装过程及注意事项

第一步 &#xff1a;安装系统必须组件 由于子系统是系统自带组件&#xff0c;需要安装软件支持 第二步&#xff1a;应用商店安装 ubuntu 编辑 编辑 这个时候打开会报错 第三步&#xff0c;运行linux子系统 选择Windows PowerShell 以管理员身份运行&#xff09; 输入&#…

docker基础操作练习

目录 1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 5.怎么查看正在…

微信个人号二次开发过程、微信ipad协议

友情链接&#xff1a;geweapi.com 点击即可访问 大家好&#xff0c;今天给大家介绍下ipad的具体情况以及特点 傻瓜式API&#xff0c;掌握JAVA、Go、PHP、Python等任意一种后端代码&#xff0c;你就可以 通过API 搭建一个 微信机器人功能 &#xff0c;用来自动管理微信消息 我们…