SpringBoot之事务源码解析

 首先事务是基于aop的,如果不了解aop的,建议先去看下我关于aop的文章: Spring之aop源码解析
 先说结论,带着结论看源码。首先,在bean的生命周期中,
执行实例化前置增强,会加载所有切面并放入缓存,其中就包括我们事务增强的切面,在bean的初始化后置增强会遍历bean的所有方法是否有@Transactional,如果有则生成代理对象。当调用增强方法时,会先开启事务,然后在执行原方法,最后在提交事务或回滚。

事务使用

在这里插入图片描述

 在SpringBoot中是默认开启了事务的,而在spring跟spring mvc中,开启事务需要手动的加上@EnableTransactionManagement注解。这是因为SpringBoot自动装配上TransactionAutoConfiguration类,这个类内部就有@EnableTransactionManagement注解。如果不了解自动装配,可以看下我这篇文章SpringBoot自动装配原理之深入源码解析

spring会解析@Import注解
而TransactionManagementConfigurationSelector实现了ImportSelector接口,spring会调用其selectImports方法
在这里插入图片描述

返回AutoProxyRegistrar,ProxyTransactionManagementConfiguration这两个类继续解析
在这里插入图片描述
AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,则会调用registerBeanDefinitions方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
向容器中注入InfrastructureAdvisorAutoProxyCreator类,前提是没有开启aop,因为aop的AnnotationAwareAspectJAutoProxyCreator功能更加强大。(向ioc注入一个BeanpostProcessor,顾名思义这个类用来进行自动代理)

ProxyTransactionManagementConfiguration是一个配置Bean,向容器内注入了TransactionInterceptor,TransactionAttributeSource,BeanFactoryTransactionAttributeSourceAdvisor这三个Bean,相当于advice,pointcut,advisor。

在spring的生命周期中,bean的实例化前置增强环节,会从ioc中加载所有切面,就会找到BeanFactoryTransactionAttributeSourceAdvisor,并放入缓存。我这里直接来到AbstractAutoProxyCreator的postProcessBeforeInstantiation方法,它是AbstractAutoProxyCreator是InfrastructureAdvisorAutoProxyCreator跟AnnotationAwareAspectJAutoProxyCreator的父类,不管有没有开启aop,都会调用这个方法。

我们的BeanFactoryTransactionAttributeSourceAdvisor是一个Advisor,所以被加入了adviseBeans缓存中。
在这里插入图片描述

我们直接来到Student这个Bean生命周期中的初始化后置增强

我这里遍历到AnnotationAwareAspectJAutoProxyCreator(因为我开启了aop,没有使用aop则是InfrastructureAdvisorAutoProxyCreator)

在这里插入图片描述

判断是否需要代理
在这里插入图片描述

匹配自己的切面
在这里插入图片描述
在这里插入图片描述

在方法1中,拿到之前缓存的BeanFactoryTransactionAttributeSourceAdvisor
在方法2中,遍历studentService所有方法是否匹配BeanFactoryTransactionAttributeSourceAdvisor,匹配规则是有@Transactional注解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

找到@Transactional注解并封装成TransactionAttribute
在这里插入图片描述

上面就是匹配切面的过程
匹配成功生成代理对象

当调用事务方法时,执行切面逻辑

来到TransactionInterceptor的invoke方法

在这里插入图片描述

在这里插入图片描述

createTransactionIfNecessary

在这里插入图片描述

获取事务,此时事务为空
在这里插入图片描述

开启新的事务
在这里插入图片描述

创建新的事务并开启

在这里插入图片描述
在这里插入图片描述

将连接的自动提交设置为false
在这里插入图片描述

将连接放到threadLocal中
在这里插入图片描述
在这里插入图片描述

completeTransactionAfterThrowing

在这里插入图片描述

判断异常类型是否@Transactional指定类型,若没指定,使用默认类型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调用连接池或jdbc的回滚方法
在这里插入图片描述

commitTransactionAfterReturning

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调用jdbc或连接池的commit方法
在这里插入图片描述

提交后,释放连接,并将threadlocal的连接移除
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Django模板(三)

一、标签URL 返回与给定视图和可选参数相匹配的绝对路径引用(不含域名的 URL) {% url some-url-name v1 v2 %} 第一个参数是url模式名称,后面跟着的是参数,以空格分隔可以使用关键字: {% url some-url-name arg1=v1 arg2=v2 %}如果您想检索命名空间的URL,请指定完全限定…

最大子数组和[中等]

一、题目 给定一个长度为n的环形整数数组nums,返回nums的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i 1) % n],nums[i]的前一个元素是nums[(i - 1 n) % n]。 子数…

AdaBoost算法

Boosting是一种集成学习方法,AdaBoost是Boosting算法中的一种具体实现。 Boosting方法的核心思想在于将多个弱分类器组合成一个强分类器。这些弱分类器通常是简单的模型,比如决策树,它们在训练过程中的错误会被后续的弱分类器所修正。Boosti…

Codeforces Round 923 (Div. 3)补题

Make it White(Problem - A - Codeforces) 题目大意:有一排格子,其中有黑色和白色两种,我们选择一个区间,将区间中的格子全部染成白色,只能选一次,问将这一排格子都染成白色&#x…

【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行1

Visual Studio 2022 在Windows上编译调试WSL2 CMake Linux工程 好像是我自己的vs2022的一个插件支持rust https://github.com/kitamstudios/rust-analyzer.vs/blob/master/PREREQUISITES.md Latest rustup (Rust Toolchain Installer). Install from here. Welcome to Rust!Th…

【性能最佳实践】跟着我们一起玩转查询模式与性能分析!

使用最新的驱动程序 MongoDB的官方驱动程序是由负责核心数据库开发的同一个专业团队打造的。这些驱动程序的更新通常比数据库本身更频繁,大概每几个月就会发布一次新版本。我们建议您尽可能使用最新版本的驱动程序,并在您使用的编程语言中安装可用的本地…

医学图像安全性概述

参考文献: Insights into security and privacy issues in smart healthcare systems based on medical images 下图左侧是医疗信息共享系统,右侧是计算机辅助诊疗策略: medical image sharing security (MISS)computer-aided diagnostic (CAD)CAD security (CADS)一般在信…

计算机毕业设计 | SSM超市进销存管理系统(附源码)

1,绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约,外国人迈克尔库伦开设了第一家合作商店,为了更好地吸引大量客流量,迈克尔库伦精心设计了低价策略,通过大量进货把商品价格压低,通过商店一次性集…

Fink CDC数据同步(二)MySQL数据同步

1 开启binlog日志 2 数据准备 use bigdata; drop table if exists user;CREATE TABLE user(id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL DEFAULT ,birth VARCHAR(20) NOT NULL DEFAULT ,gender VARCHAR(10) NOT NULL DEFAULT ,PRIMARY KEY(id) ); ALTER TA…

代码随想录算法训练营29期|day43 任务以及具体任务

第九章 动态规划 part05 1049. 最后一块石头的重量 II class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for (int i : stones) {sum i;}int target sum >> 1;//初始化dp数组int[] dp new int[target 1];for (int i 0; i < stones.lengt…

Java 将TXT文本文件转换为PDF文件

与TXT文本文件&#xff0c;PDF文件更加专业也更适合传输&#xff0c;常用于正式报告、简历、合同等场合。项目中如果有使用Java将TXT文本文件转为PDF文件的需求&#xff0c;可以查看本文中介绍的免费实现方法。 免费Java PDF库 本文介绍的方法需要用到Free Spire.PDF for Java…

【力扣】快乐数,哈希集合 + 快慢指针 + 数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数 getNext(n) &#xff0c;返回 n 的所有位的平方和。一直执行 ngetNext(n) &#xff0c;最终只有 2 种可能&#xff1a; n 停留在 1 。无限循环且不为 1 。 证明&#xff1a;情况 1 是存在的&#xff0c;如力扣的示例一…