Mysql事务及锁

news2024/12/23 13:32:41

一、MVCC原理

1.1 版本链

    trx_id :每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的 事务id 赋值给 trx_id 隐藏列。
    roll_pointer :每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到 undo日志 中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

假设之后两个 事务id 分别为 100 、 200 的事务对这条记录进行 UPDATE 操作,操作流程如下:

每次改动,都会记录一条 undo日志 ,每条 undo日志都有一个 roll_pointer 属性( INSERT 操作 对应的 undo日志 没有该属性,因为该记录并没有更早的版本),可以将这些 undo日志都连起来,串成一个链 表, 对该记录每次更新后,都会将旧值放到一条 undo日志 中,就算是该记录的一个旧版本,随着更新次数的增多, 所有的版本都会被 roll_pointer 属性连接成一个链表,我们把这个链表称之为 版本链 ,版本链的头节点就是当 前记录最新的值

二、ReadView

1、 对于读已提交和可重复读,需要使用上述的版本链,核心问题:找到哪个事务是正确的,可见的。那么怎么判断哪个事务版本是可用的呢,就需要ReadView了,我发现其实很多人都在说mvcc但是却不知道readView,真的是很奇怪。
2、 ReadView 主要由四部分组成:
  1、m_ids:记录当前活跃的所有事务,相当于一个数组,[1,2,3,4]
  2、min_trx_id: 记录当前活跃事务中最小的事务号。
  3、max_trx_id:记录下一个应该开启的事务的事务号,事务号是递增的,其实就是时间戳。
  4、creator_trx_id:表示生成该ReadView的事务号。
注意max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的事务提交了。那么一个新的读事务在生成ReadView时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。
3、有了readView之后,再查询语句的时候就可以判断哪些事务的数据是可以被查到的了:
  1、比如查询的数据的事务id < min_trx_id 表示数据在查询前没有操作过,可以操作。
  2、如果数据的事务id == creator_trx_id 则表示当前事务在查询数据,可以操作。
  3、如果数据的事务id > max_trx_id 则表示查询时,数据又被其他的事务操作过,不能查询数据,需要根据版本链查询。
  4、如果min_trx_id < 数据的事务id <max_trx_id, 需要判断是否在m_id,并且不在m_id 列表中则代表,查询时已经被提交过,可以查询。
4、 对于读已提交和可重复读,在生成ReadView的规则不同,导致了他们读取数据时候的区别:
 1、读已提交:每次执行select的时候都会生成一个readView,记录当前活跃的事务id。所以他可以读取到最新的别提交过的数据。
 2、可重读度:他只会在第一次执行select 语句的时候生成ReadView,所以多次执行ReadView相同所以查询数据相同。

三、锁结构

当一个事务想对这条记录做改动时,内存中有没有与这条记录关联的 锁结构

trx信息 :代表这个锁结构是哪个事务生成的。

is_waiting :代表当前事务是否在等待。

如图所示,当事务 T1 改动了这条记录后,就生成了一个 锁结构 与该记录关联,因为之前没有别的事务 为这条记录加锁,所以 is_waiting 属性就是 false ,我们把这个场景就称之为获取锁成功,或者加锁 成功,然后就可以继续执行操作了。

在事务 T1 提交之前,另一个事务 T2 也想对该记录做改动,那么先去看看有没有 锁结构 与这条记录关 联,发现有一个 锁结构 与之关联后,然后也生成了一个 锁结构 与这条记录关联,不过 锁结构 的 is_waiting 属性值为 true ,表示当前事务需要等待,我们把这个场景就称之为获取锁失败,或者加锁失败,或者没有成功的获取到锁,画个图表示就是这样:

在事务 T1 提交之后,就会把该事务生成的 锁结构 释放掉,然后看看还有没有别的事务在等待获取锁, 发现了事务 T2 还在等待获取锁,所以把事务 T2 对应的锁结构的 is_waiting 属性设置为 false ,然后 把该事务对应的线程唤醒,让它继续执行,此时事务 T2 就算获取到锁了。如图:

 不加锁 :意思就是不需要在内存中生成对应的 锁结构 ,可以直接执行操作。

获取锁成功,或者加锁成功:在内存中生成了对应的 锁结构 ,而且锁结构的 is_waiting 属性为 false ,也就是事务可以 继续执行操作。

获取锁失败,或者加锁失败,或者没有获取到锁:生成了对应的 锁结构 ,不过锁结构的 is_waiting 属性为 true ,也就是事务需要等 待,不可以继续执行操作。

    在 READ UNCOMMITTED 隔离级别下, 脏读 、 不可重复读 、 幻读 都可能发生。
    在 READ COMMITTED 隔离级别下, 不可重复读 、 幻读 可能发生, 脏读 不可以发生。
    在 REPEATABLE READ 隔离级别下, 幻读 可能发生, 脏读 和 不可重复读 不可以发生。
    在 SERIALIZABLE 隔离级别下,上述问题都不可以发生。


3.2 怎么解决 脏读 、 不可重复读 、 幻读 这些问题呢?

3.2.1 方案一:读操作利用多版本并发控制( MVCC ),写操作进行 加锁 。

3.2.2 方案二:读、写操作都采用 加锁 的方式。

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

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

相关文章

木棒切割问题

题目很简单&#xff0c;就是我们在写二分的时候&#xff0c;会遇到这样的情况&#xff1a; mid left (right-left)/2; if (nums k)return mid;if (nums>k)left mid;if (nums<k)right mid-1; 若我们debug会发现其可能会一致卡在left mid&#xff0c;例如&#xff08…

ceph Monitor原理和代码流程介绍

Monitor介绍 Monitor在Ceph集群中扮演管理者的角色&#xff0c;维护了整个集群的状态&#xff0c;集群的状态被抽象成几个Map对象&#xff0c;包括monmap、osdmap、mdsmap、authmap、logmap等&#xff0c;保证集群的相关组件在同一时刻能够达成一致&#xff0c;相当于领导层。…

语言深入理解指针(非常详细)(三)

目录 数组名的理解使用指针访问数组 一维数组传参的本质二级指针指针数组指针数组模拟二维数组 数组名的理解 在上⼀个章节我们在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里我们使用 &am…

医者无疆 | AI赋能大医精诚,医疗制药的进阶与突破

在历史的长河中&#xff0c;医学一直是人类文明的重要组成部分。从古希腊的希波克拉底到现代医学研究&#xff0c;医学始终与时俱进&#xff0c;为人类的健康和福祉做出了巨大的贡献。在互联网、大数据、5G等信息技术的迭代下&#xff0c;人工智能&#xff08;AI&#xff09;的…

cpp20规范 vs2019 STL库 unordered_map源码分析(整理后上传)

&#xff08;1&#xff09; unordered_map 模板有如下的模板调用和包含关系。 绿箭头1 处的模板类&#xff0c;继承了绿箭头2 &#xff0c; 绿箭头2 又继承了红框模板。但红框模板有一个泛化版本和一个特化版本&#xff0c;选择哪一个呢&#xff1f; 经过源代码查找&#xff0…

腾讯张乐:“反内卷”潮流已至,研发效能是软件企业必由之路

目录 Why&#xff5c;“狂飙”踩下刹车&#xff0c;“湖水岩石效应”加速显现 What&#xff5c;效能 ≠ 效率&#xff0c;效能 效率 有效性 How&#xff5c;研发效能“黄金三角” e.g.&#xff5c;软件研发效能实践中的“坑”与“解” 1. 忽视重视工程师的声音 2. “迷…

【Spring】SpringBoot的10个参数验证技巧

这里写目录标题 前言1.使用验证注解2 使用自定义验证注解3 在服务器端验证4 提供有意义的错误信息5 将 i18n 用于错误消息messages.properties6 使用分组验证7 对复杂逻辑使用跨域验证8 对验证错误使用异常处理9 测试你的验证逻辑10 考虑客户端验证总结 前言 参数验证很重要&am…

跨空间域数据管理分布式共识算法:现状、挑战和展望

跨空间域数据管理分布式共识算法&#xff1a;现状、挑战和展望 李伟明1&#xff0c;李彤1,2, 张大方1&#xff0c;戴隆超1,2, 柴云鹏1,2 1 中国人民大学信息学院&#xff0c;北京 100872 2 数据工程与知识工程教育部重点实验室&#xff0c;北京 100872 摘要&#xff1a;随着数字…

生信学院|09月08日《SOLIDWORKS扣合特征应用》

课程主题&#xff1a;SOLIDWORKS扣合特征应用课程时间&#xff1a;2023年09月08日 14:00-14:30主讲人&#xff1a;陈冬冬 生信科技 售后服务工程师1、什么是扣合特征2、唇缘与凹槽3、装配体凸4、台通风孔5、弹簧扣与弹簧扣卡槽请安装腾讯会议客户端或APP&#xff0c;微信扫描海…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——排列组合——分堆分配

⛲️ 一、考点讲解 1.方法介绍 在排列组合中&#xff0c;经常遇到元素分堆或分组问题&#xff0c;尤其难点是出现等数量的分堆&#xff0c;很多考生容易犯错误。 2.方法应用 平均分成的组&#xff0c;不管他们的顺序如何&#xff0c;都是一种情况&#xff0c;所以分组后一定要…

HTML5-3-表格

文章目录 属性边框属性标题跨行和跨列单元格边距 HTML 表格由 <table> 标签来定义。 tr&#xff1a;tr 是 table row 的缩写&#xff0c;表示表格的一行。td&#xff1a;td 是 table data 的缩写&#xff0c;表示表格的数据单元格。th&#xff1a;th 是 table header的缩…

Python中if __name__ == ‘__main__‘:的作用和原理

if name ‘main’:的作用 一个python文件通常有两种使用方法&#xff0c; 第一是作为脚本直接执行&#xff0c;第二是 import 到其他的 python 脚本中被调用&#xff08;模块重用&#xff09;执行。 举例说明如下&#xff1a; 在本文件中&#xff0c;name 是main 在被impor…

Vue3---uni-app--高德地图引用BUG

先给报错信息&#xff1a;module libs/map//libs/map_min.js is not defined, require args is /libs/map_min.js 查看我引用方法&#xff1a; 本人查阅资料发现 是 require 使用的是 commonJS方式引用说这个适配Vue2可我项目是Vue3应该使用ES6语法糖 然后我有跑了项目发现BU…

【Unity编辑器扩展】 | 编辑器扩展入门基础

前言 【Unity编辑器扩展】 | 编辑器扩展入门基础一、基本概念二、核心知识点 简述三、相关API 总结 前言 当谈到游戏开发工具&#xff0c;Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境&#xff0c;使他们能够创建令人惊叹的游戏和交互式体验。然而…

1.若依框架介绍与环境搭建

文章目录 若依框架介绍官网地址相关技术栈 环境搭建1.git介绍下载与安装学习资料 2.maven介绍与下载环境变量配置资料学习 3.node4.java5.idea6.vscode7.mysql可视化工具HeidiSql 8.redis参考资料遇到问题 若依框架介绍 官网地址 若依框架官网地址&#xff1a;http://www.ruo…

stm32 学习笔记:GPIO输出

一、GPIO简介 引脚电平 0-3.3V,部分可容忍5V&#xff0c;对输出而言最大只能输出3.3V, 只要可以用高低电平来控制的地方&#xff0c;都可以用GPIO来完成&#xff0c;如果控制的功率比较大的设备&#xff0c;只需加入驱动电路即可 GPIO 通用输入输出口&#xff0c;可配置为 8种 …

【程序员必知必会3】你还不懂ClickHouse和Hive的区别?!

ClickHouse和Hive究竟哪些区别 ClickHouse和Hive都是用于大数据处理和分析的分布式存储和计算系统&#xff0c;但它们之间存在一些区别&#xff1a; 架构&#xff1a;ClickHouse采用列式存储和向量化执行引擎&#xff0c;可以实现亚秒级别的数据查询。而Hive采用基于Hadoop的数…

Nancy2.0引入Swagger并设置其为嵌入的资源

因为项目需求&#xff0c;需要在Nancy的基础上引入Swagger&#xff0c;万能的互联网上有现成的方案&#xff0c; 方案写的很详细&#xff0c;实际按文档也成功的实现了相应的功能&#xff0c;但因为我是在基础dll里包含了该功能&#xff0c;所以我希望swagger-ui是作为嵌入的资…

实时操作系统Freertos开坑学习笔记:(七):队列

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么&#xff1f;而在freertos中&#xff0c;队列是什么呢&#xff1f;①如果要进行中断、任务的交流&#xff0c;那我用全局变量行吗&#xff1f;②…

VMware虚拟机安装_新虚拟机创建_CentOS镜像导入_linux指令基本操作

文章目录 1 VMware下载安装1.1 下载网址1.2 安装步骤 2 创建虚拟机与CentOS镜像导入2.1 创建新虚拟机2.2 导入CentOS镜像 3 获取ip与连接Xshell3.1 查看虚拟机ip地址3.2 Xshell使用 1 VMware下载安装 1.1 下载网址 https://www.vmware.com/cn/products/workstation-pro/works…