spring本地事务与单/多线程

请直接看原文

原文链接:多线程与数据库事务以及数据库连接之间的关系 - 知乎 (zhihu.com)

--------------------------------------------------------------------------------------------------------------------------------

今天我们来梳理一下, 多线程、数据库事务、数据库连接之间的关系

单线程下

先来看一段代码

   @Transactional@Overridepublic void updateTest(Test updateVO) {Test test = testMapper.selectByPrimaryKey(updateVO.getId());System.out.println("当前线程是: "+Thread.currentThread().getName()+"查出来的值是"+JSON.toJSON(test).toString());testMapper.updateByPrimaryKey(updateVO);testMapper.deleteByPrimaryKey(2);}

这段代码说明了什么?

  • 开启了事务
  • 其中有三次和数据库交互的操作

问题来了,这三个与数据库的操作,与数据库建立的连接是同一个吗?还是不同的连接呢?

  • 开启事务的话,建立一次连接 :控制台输出Fetched SqlSession的字样
  • 没开启事务的话,建立三次连接 :控制台输出Creating a new SqlSession的字样

为什么会这样呢,就是因为 我们经常说的事务

假如说,当我们有一个线程A来执行此方法时,发现此方法开启了事务, 而事务,又是基于数据库Connection连接的,这个事务中有三个操作数据库的dao方法,此时线程A会用同一个connection连接操作这三个dao方法.

我们再来看下事务,假如说程序有一个方法,一个方法里调了两个接口方法,每个接口方法都开启了事务,每个接口都有三个dao方法的操作.如下面类似的代码

结果就是如下图:一个线程对应一个connection数据库连接,  这个连接上可以有两个事务,且两个事务都能正常执行且互不影响. 

多线程下

假如说有两个线程同时进入这个接口,线程操作数据库里数据时,那么他们的关系又会是什么样的呢?

从图中我们可以看到,两个线程分别获得不同的数据库连接,各自有各自的事务,这个时候,就是前文说的多事务

总结

1.同一时刻,不同的线程会获取到不同的数据库连接Connection对象,各自开启各自的事务, 每个事务之间是由mysql自己来实现事务的隔离性的.

2.开启事务后,为什么三个dao方法可以获得同一个Connection?

当前线程把connection对象存到了ThreadLocal中, ThreadLocal 中保存了一个 map,key 是DataSource数据源,value 是数据库连接Connection。当一个线程多次操作数据库的时候(很多个dao),每次都可以获得同一个数据库连接.

3.为什么要确保是同一个数据库连接?

是因为数据库的事务是基于数据库连接的,如果这个线程操作了三次dao每次连接都不一样,那么就没办法保证这三次操作被同一个事务所管理.

4.什么是本地事务?

就是几个dao方法只被一个线程操作,然后就只产生了一个connection连接对象. 这才能就是说是本地事务.


 

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

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

相关文章

【数据库】基于索引的扫描算法,不同类型索引下的选择与连接操作,不同的代价及优化

基于索引的算法 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更…

JDK8升级JDK11最全实践干货来了

1、前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本。那么从JDK8到JDK11,到底带来了哪些特性呢?值得我们升级吗&#x…

利用canal进行MySQL到ES的数据实时同步

1. 背景 项目中业务数据量比较大,每类业务表都达到千万级别,虽然做了分库分表,每张表数据控制在300W以下,但是效率还是达不到要求,为了提高查询效率,打算使用ES进行数据查询。 2. 同步原理 canal 模拟 My…

csapp-linklab之第二阶段“输出学号”实验报告

本阶段主题是链接中的“重定位”。两次重定位,一次是绝对地址重定位,一次是PC相对地址重定位。 本题目标依旧是输出学号,反汇编phase2.o,看到学号“0000000000”已经存放在只读数据区了。现在任务就是改do_pheas的指令和重定位表…

题目标题:乐乐摘苹果(杨鼎强)

一天乐乐去果园玩,发现一棵苹果树上结出10个苹果。乐乐跑去摘苹果。乐乐找到一个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。 现在已知10个苹果到地面的高度,以及乐乐把手伸直的时候能够达到的最大高度…

Ubuntu系统Springboot项目Nginx安装(编译安装方式)

1.下载 nginx官网下载 Index of /download/ 2.解压 这里我下载的1.25.3版本,系统是ubuntu 解压 tar -zxvf nginx-1.25.3.tar.gz 3.编译安装 安装前需要执行安装一些系统依赖 3.1安装PCRE库 ubuntu:执行以下命令 sudo apt-get install libpcre…

uniapp2023年微信小程序头像+昵称分别获取

1、DOM <view class"m-user"><view class"user-info"><!--头像 GO--><button class"avatar avatar-wrapper" open-type"chooseAvatar" chooseavatar"onChooseAvatar"slot"right"><im…

c++实现程序单例运行的两种方式

第一种使用互斥体 // 使用互斥体保证单体运行 BOOL IsAlreadyRun() {HANDLE hMutex NULL;hMutex CreateMutex(NULL, FALSE, L"MYFLAG");if (hMutex ! NULL){if (ERROR_ALREADY_EXISTS GetLastError()){ReleaseMutex(hMutex);return TRUE;}}return FALSE; } int m…

国家高新技术企业认定,可以提前准备这些!

尽早获取核心自主知识产权 对于高新技术企业认定中有Ⅰ类和Ⅱ类知识产权之分。 其中&#xff0c;企业拥有的专利、植物新品种、国家新药、软件著作权等属于Ⅰ类核心知识产权&#xff0c;是高新技术企业认定的首要和必须条件&#xff0c;在高企认定中也会给申请人带来相应较高…

获取国内城市编码API

获取国内城市编码API接口 一、获取国内城市编码接口二、使用步骤1、接口2、请求参数 三、 案例和demo 一、获取国内城市编码接口 一款免费的帮助你获取取国内城市编码的接口 二、使用步骤 1、接口 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议 请求…

【Lidar】基于Python的Open3D库可视化点云数据

1 Open3D库介绍 1.1 介绍 Open3D是一个开源的3D数据处理库&#xff0c;发布于2015年&#xff0c;目前已经更新到0.17.0版本。它基于MIT协议开源许可&#xff0c;使用C11实现&#xff0c;并经过高度优化&#xff0c;还通过Python Pybinding提供了前端Python API。 Open3D为开发…

C语言之atoi函数的使用和模拟实现

C语言之atoi函数的使用和模拟实现 1. atoi函数介绍 函数声明如下&#xff1a; int atoi (const char * str);atoi是用来将字符串中第一次出现的数字字符&#xff0c;转为一个整数 跳过空白字符&#xff0c;&#xff08;空白字符包括&#xff1a;空格 ’ ’ &#xff0c;换页…

我叫:基数排序【JAVA】

1.自我介绍 基数排序(radix sort)属于“分配式排序” (distribution sort)&#xff0c;又称“桶子法” (bucket sort)或bin sort,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,是‘桶排序’的扩展 2.基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数…

docker start一个容器之后,怎么进入这个容器界面

要进入已经启动的 docker 容器的交互式终端&#xff0c;可以使用 docker exec 命令。这个命令可用于在运行中的容器内部执行命令或脚本&#xff0c;并以交互模式与容器进行交互&#xff0c;具体格式如下&#xff1a; # docker exec -it [container_id or container_name] /bin/…

专业的调查问卷平台推荐:提升数据收集与分析效率

无论是学生还是职场人士&#xff0c;想做好一份调查问卷&#xff0c;关键先要确定调查的主题&#xff0c;然后确定调查人群&#xff0c;编辑问题&#xff0c;最后能够尽可能的美化问卷调查的主题。 想要做到这几点&#xff0c;就要要求问卷调查平台: 1、能够帮助你快速制作出一…

【开题报告】基于模糊控制的花卉光照时间控制系统

题 目 基于模糊控制的花卉光照时间控制系统 一、研究目的和意义 用光电传感器检测自然光&#xff0c;根据花卉开花时长&#xff0c;用MATLAB软件&#xff0c;使用模糊控制算法&#xff0c;对测得数据进行分析&#xff0c;得出结论&#xff0c;并传回下位机控制电机运动…

软件测试测试文档的编写和阅读

在软件测试中的流程中&#xff0c;测试文档也是一个重要的流程&#xff0c;所以测试人员也需要学习测试文档的编写和阅读。 一、定义&#xff1a; 测试文档&#xff08;Testing Documentation&#xff09;记录和描述了整个测试流程&#xff0c;它是整个测试活动中非常重要的文…

QT应用示例

一个简单的QT应用示例&#xff1a;创建一个窗口程序。 首先&#xff0c;确保已经安装了Qt开发环境。接下来&#xff0c;按照以下步骤创建一个简单的窗口程序&#xff1a; 1. 打开Qt Creator&#xff0c;点击“新建文件或项目”。 2. 选择“应用程序”&#xff0c;然后点击“下…

年终好价节有什么必买的数码好物?值得入手的数码好物推荐

大家是不是都没听说过好价节&#xff1f;直白点说就是原来的双十二购物狂欢节&#xff0c;只不过换一个说法&#xff0c;不过今年毕竟是第一年换个说法&#xff0c;所以淘宝年终好价节优惠还是值得我们期待的&#xff01;作为年前的最后一波大促&#xff0c;一起来看看有哪些好…

QML通用属性 pyside6

在 QML 中&#xff0c;几乎所有组件都继承自 Item 类型&#xff0c;因此它们共享一些通用的属性。 QML 组件通用属性 位置和尺寸 x 和 y: 组件在其父元素中的位置坐标 Item {x: 100y: 100 }width 和 height: 组件的宽度和高度 Item {width: 200height: 100 }z: 组件在 Z 轴…