mybatis事物是如何和spring事物整合的

目录

1、mybatis事物管理器

2、SpringManagedTransactionFactory如何处理事物

3、spring事物如何设置connection连接到threadLocal


1、mybatis事物管理器

mybatis事物抽象接口类:Transaction。该接口定义了事物基本方法和获取数据库连接方法

 该类有三个实现类JdbcTransaction、ManagedTransaction、SpringManagedTransaction。

其中JdbcTransaction、ManagedTransaction是mybatis自己使用,不是我们关注的对象。我们重点关注SpringManagedTransaction,在spring环境中,mybatis使用该类来处理事物。

 既然明确了是使用该类来处理事物,那我们先来看看在哪里初始化SpringManagedTransaction。老套路,ctrl+f, 发现只有在 SpringManagedTransactionFactory类中调用

 继续查看 SpringManagedTransactionFactory 在哪里调用,发现是在org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory()方法中初始化

mybatis-spring中,是通过SqlSessionFactoryBean#buildSqlSessionFactory()方法创建

SqlSessionFactory, 即说明mybatis-spring中默认使用SpringManagedTransactionFactory 为事物管理器。

2、SpringManagedTransactionFactory如何处理事物

从SpringManagedTransaction#getConnection()方法开始,到重点方法

DataSourceUtils.getConnection(this.dataSource)。其中DataSourceUtils类是spring提供的工具类

 跟进去,查看DataSourceUtils#doGetConnection()源码,发现先从spring提供的threadLocal中获取connection连接,如果没有则重新获取,并且会通过 TransactionSynchronizationManager.isSynchronizationActive() 判断当前是否处于spring事物中,如果是则需要将connection连接绑定到spring threadLocal中。

 至此,已经解决了mybatis是如何获取spring事物中的连接的。既然有获取,就有地方设置,那么下面我们再看spring事物是如何设置connection连接到threadLocal中的。

3、spring事物如何设置connection连接到threadLocal

熟悉spring事物的同学都知道,spring事物的增强是在TransactionInterceptor中的,那么我们直接看该方法的invoke方法

 继续看核心方法TransactionAspectSupport#invokeWithinTransaction()方法

 

我们重点看TransactionAspectSupport#createTransactionIfNecessary()方法是如何处理的,跟进去最后会到TransactionAspectSupport#prepareTransactionInfo()方法,

 

最后会到TransactionAspectSupport.TransactionInfo#bindToThread()方法,继续跟进去

 那么我们再看,发现和 DataSourceUtils 没有丝毫关系。说明我们找错了地方。

再次查看 TransactionSynchronizationManager#bindResource()方法调用地方,发现是在

AbstractPlatformTransactionManager#startTransaction()方法中绑定。那么

需要查看 AbstractPlatformTransactionManager 和 TransactionInterceptor 的关系。

发现 在初始化 TransactionInterceptor的时候,会设置  DataSourceTransactionManager。

 再回头查看,发现此处会调用AbstractPlatformTransactionManager#getTransaction()方法。

继续跟,发现 此处会调用子类 DataSourceTransactionManager#doGetTransaction()方法

由于 doGetTransaction() 方法为获取已存在的事物,所以我们重点看新建事物的处理

 

在 DataSourceTransactionManager#doBegin()方法中,可以看到将新建的事物绑定到当前线程上下文

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Vue前后端分离旅游网站详细设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

pytorch工具——使用pytorch构建一个分类器

目录 分类器任务和数据介绍训练分类器的步骤在GPU上训练模型 分类器任务和数据介绍 训练分类器的步骤 #1 import torch import torchvision import torchvision.transforms as transformstransformtransforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.…

docker数据网络管理

数据管理 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。 1.数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂…

详细解析python视频选择--【思维导图知识范围】

C ,JAVA JAVAWEB ,微信小程序等 都有视频选择的分析。 语言视频选择收录专辑链接C张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】JAVA黑马B站视频JAVA部分的知识范围、学习步骤详解JAVAWEB黑马B站视频JAVAWEB部分的知识范围、学习步骤详解SpringBootSpringB…

Qt/C++音视频开发48-推流到rtsp服务器

一、前言 之前已经打通了rtmp的推流,理论上按照同样的代码,只要将rtmp推流地址换成rtsp推流地址,然后格式将flv换成rtsp就行,无奈直接遇到协议不支持的错误提示,网上说要换成rtp,换了也没用,而…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 13 Neural Nets and Deep Learning

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 13 Neural Nets and Deep Learning In this chapter, we shall consider the design of neural nets, which are collections of perceptrons, or nodes, where the outputs of one rank (or lay…

使用 Docker 快速上手中文版 LLaMA2 开源大模型

本篇文章,我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型,国内第一个真正开源,可以运行、下载、私有部署,并且支持商业使用。 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后,Git…

Spring Security 的工作原理/总体架构

目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理(类) 2、FilterChainProxy 过滤器链代理(类) 4、SecurityFilterChain 安全过滤器链(接口) 5、Security Filters 安全过滤器实例 6、Sp…

基于sklearn计算precision、recall等分类指标

文章目录 一、分类指标函数1.1 precision_score函数1.2 recall_score函数1.3 accuracy_score函数1.4 f1_score函数1.5 precision_recall_curve函数1.6 roc_curve函数1.7 roc_auc_score函数1.8 classification_report函数 二、二分类任务三、多分类任务3.1 Macro Average&#x…

Meta牵手Microsoft推出下一代Llama 2

官方消息 1、今天,我们将介绍 Llama 2 的可用性,这是我们的下一代开源大型语言模型。 2、Llama 2免费用于研究和商业用途。 3、Microsoft和 Meta 正在扩大他们的长期合作伙伴关系,Microsoft 是 Llama 2 的首选合作伙伴。 4、在技术、学术…

力扣 -- 122. 买卖股票的最佳时机 II

一、题目: 题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode) 二、解题步骤 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码: clas…

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-15/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org visonOS …

基于ESP32-S3-BOX-Lite的语音合成与播报系统(esp-idf+WiFi+HTTPS+TTS)

目录 项目介绍硬件介绍项目设计开发环境及工程目录总体流程图硬件初始化WiFiHTTPS请求TTS语音合成与播报cJSON解析TTS初始化语音合成与播报 附加功能按键回调LVGL数据可视化显示 功能展示项目总结 👉 【Funpack2-5】基于ESP32-S3-BOX-Lite的语音合成与播报系统 &…

WAF/Web应用安全(拦截恶意非法请求)

Web 应用防火墙(Web Application Firewall, WAF)通过对 HTTP(S) 请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、跨站请求伪造等攻击,保护 Web 服务安全稳定。 Web 安全是所有互联网应用必须具备的功能&#xff0c…

Linux 下centos 查看 -std 是否支持 C17

实际工作中,可能会遇到c的一些高级特性,例如std::invoke,此函数是c17才引入的,如何判断当前的gcc是否支持c17呢,这里提供两种办法。 1.根据gcc的版本号来推断 gcc --version,可以查看版本号,笔者…

Vue上传图片返回base64并在页面展示,并图片上canvas进行红框框选标记

https://www.cnblogs.com/szqtiger/p/12100754.html vue如何显示base64图片_vue显示base64_不断学习的码农的博客-CSDN博客 图片上进行红框框选_时小帅的博客-CSDN博客 设置canvas画布大小_canvas设置画布大小_最凶残的小海豹的博客-CSDN博客 图片回显 结合以上&#xff0…

Idea maven窗口 展示不分级 maven层级混乱

1. 正在写分布式im 开源项目:nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务) lsb (负载均衡)store(存储) - Gitee.com …

vue学习笔记(三)

1.vue开发存在SEO问题 前端开发采用vue开发后是单页面 单页面里面,前后端分离,渲染过程是js写的,在js调用接口返回数据之前,页面已经被打开了 实际上就是空白页面,这个时候右键点击查看源代码,实际上是都…

前端学习——Vue (Day2)

指令补充 指令修饰符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

两天学会用Webpack打包前端代码-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 什么是 Webpack&#xff1f; 使用 Webpack 体验webpack打包过程 修改 Webpack 打包入口和出口 入口 出…