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

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

首先,如果在某个类或某个方法被标记为@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.lryc.cn/news/130369.html

相关文章:

  • JVM——引言+JVM内存结构
  • open cv学习 (十)图形检测
  • 【C语言】字符函数和字符串函数
  • 前馈神经网络正则化例子
  • spring的核心技术---bean的生命周期加案例分析详细易懂
  • 【Maven教程】(一)入门介绍篇:Maven基础概念与其他构建工具:理解构建过程与Maven的多重作用,以及与敏捷开发的关系 ~
  • 今天,谷歌Chrome浏览器部署抗量子密码
  • SUMO traci接口控制电动车前往充电站充电
  • 现代CSS中的换行布局技术
  • 简单理解Python中的深拷贝与浅拷贝
  • C++之std::pair<uint64_t, size_t>应用实例(一百七十七)
  • 前端打开后端返回的HTML格式的数据
  • How to deal with document-oriented data
  • Http 状态码汇总
  • mysql自定义实体类框架
  • 批量将Excel中的第二列内容从拼音转换为汉字
  • 消息推送:精准推送,提升运营效果,增添平台活力
  • [保研/考研机试] KY43 全排列 北京大学复试上机题 C++实现
  • Java将时间戳转化为特定时区的日期字符串
  • 【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字
  • 通过 kk 创建 k8s 集群和 kubesphere
  • 感觉和身边其他人有差距怎么办?
  • 【C语言基础】宏定义的用法详解
  • 微服务系列文章之 SpringBoot 最佳实践
  • C++并发多线程--std::async、std::packaged_task和std::promise的使用
  • opencv-目标追踪
  • 【数据结构】 单链表面试题讲解
  • C++ string类的模拟实现
  • Qt实现简单的漫游器
  • 【c语言】文件操作