MYSQL 锁机制 与 MVCC多版本并发

news2024/10/6 22:31:24

MYSQL锁机制与优化以及MVCC底层原理

锁分类

乐观锁,悲观锁

从性能上分为乐观锁版本对比,版本一致就更新,不一致就不更新或CAS机制)和悲观锁(锁住资源等待),乐观锁适合读比较多的场景,悲观锁适合写比较多的场景;如果在写操作比较多的场景,用乐观锁会导致对比次数过多,影响性能,因为每次查询到的版本号,和更新时的版本号就很容易不一致,就会cpu空转;

表锁,页锁,行锁

从数据操作的粒度上来说,分为表锁,页锁,行锁;

表锁每次锁住一张表,开销小,因为在表层面直接添加锁标记,不用一条一条查找记录,锁粒度大,发生锁冲突概率高,并发度低,一般在整张表数据迁移的时候,才会用;

手动增加表锁

Lock table 表名称 read(或者write);

查看表上加过的锁

Show opentables;

删除表锁

Unlock tables;

行锁的锁粒度小,但是因为它需要进行数据查找,所以开销相对表锁大,行锁其实不是添加到哪一行数据上的,它是添加到它的索引上的,如果我们添加锁时,条件字段没有索引,那么就可能锁整张表(RR会升级为表锁,RC不会);

关于RR级别行锁升级为表锁的原因

因为在RR的隔离级别下,需要解决不可重复读和幻读的问题,如果没有通过索引加锁,那么就会遍历所有的聚簇索引时,都会添加锁,为了防止扫描过的索引被其它事务修改,或间隙(主键为整数1,3之间的间隙就是2)被其它事务插入(幻读),从而导致数据不一致,所以它是把所有的索引记录和间隙都锁上;

页锁只有BDB的存储引擎才支持,页锁就是锁定的资源比行锁要多;页锁介于行锁和表锁之间;有点类似分段锁;

读锁,写锁,意向锁

从数据的操作类型上分为读锁和写锁;

读锁(共享锁)

针对同一数据,多个事务中的读操作可以同时进行,不会相互影响;

写锁

当前操作没有玩,其它的读锁和写锁都会被阻塞;数据的修改(insert,update,delete)操作都会添加写锁,查询也可以通过

Select * from table1 where id=1 for update;

来添加写锁;

意向锁

主要是为了提升增加表锁的效率,比如A表中又一行数据添加了行锁,但是这时另一个事务要添加表锁,正常情况下,添加表锁前要去遍历所有数据判断,是否存在行锁,但是为了效率,只要添加了行锁,这这张表添加一个标识,表示A表已经有行锁了,这样它就可以直接判断到底能不能加锁了;

间隙锁,临键锁

间隙锁本质是一个写锁,但它锁的不是索引值,而是两个索引值之间的空隙范围,间隙锁是一个开区间,只要锁了间隙内的一条数据,那么它就会锁住整个间隙,也就是范围锁;在可重复读级别才会生效,它主要就是用来解决幻读

比如表中数据

我现在锁住一个间隙,

Select * from account where id =15 for update; id=15的数据添加写锁

但是这时我添加10,20之间的任意一条数据都不行会被锁住,当然10和20可以操作;这就是间隙锁;

幻读就是A事务读取到了B事务在间隙中新插入的数据,这个时候我们只要在间隙区间添加一个间隙锁,让它在这个区间不能插入,就能解决幻读的问题;

临键锁

间隙锁和行锁的结合,就是把间隙锁的开区间变成闭区间,这里就是3到10的区间有锁,然后10这行真实存在的数据也有锁;

锁等待分析

查看当前锁等待的情况

Show status like ‘innodb_row_lock%‘ ch

查看库中当前所有的具体锁等待,事务,锁

查看事务

Select * from INFOMATION_SCHEMA.INNODB_TRX;

查看锁

Select * from INFOMATION_SCHEMA.INNODB_LOCKS;

查看锁等待

Select * from INFOMATION_SCHEMA.INNODB_LOCK_WAITS;

释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到;

Kill trx_mysql_thread_id;

查看锁等待详细信息(锁日志)这个排查生产问题很重要

Show engine innodb status;

锁优化实践

RR级别隔离级别,不通过索引来加锁,会升级为表锁;

MVCC多版本并发控制机制 1:52:45

Undo日志版本链,

在并发的情况下,或者说多个事务都在修改同一条数据的时候,会生成日志版本链,它是为了数据进行回滚的,当所有事务都完成提交后,关于当前数据的日志版本链就是被删除;新增的数据版本链会马上删除,当同时有修改进来,新增的操作不提交,就没有数据进行修改,所以在新增提交后,修改的会新生成日志版本链,;

RR隔离级别,

为了能解决不可重复读的情况,它在第一次读取数据时,会记录当前已存在事务的状态,如果当前为已提交,则可读,当前为未提交则不可读,根据它的undo日志链一层一层找,直到找到这条数据此时已经提交的那条日志记录;

具体可见性算法逻辑如下

针对某一行数据的事务,

最小活跃事务ID:当前还没有提交的最小事务ID

最大事务id+1:关于当前数据,未来要开启的新事务

活跃事务id列表:当前数据,版本链上事务还没有提交的事务

1.小于最小活跃事务ID,小于肯定就是已经提交了,可见

2,如果数据行的事务id>=Read View中记录的当前出现的最大事务id+1,则跳转步骤5执行。

3,事务id列表为空,则该行数据可见,也就是当前查询的数据行没有事务。

4,如果数据行的事务id大于等于Read View(一致性视图)最小事务id,并且

小于Read View中记录的当前出现的最大事务id+1。

判断若存在于活跃事务id列表,则不可见。

判断若不存在于活跃事务id列表,则可见。

5,根据回滚指针在undo log中取出一条记录,从1步骤重复判断,直到找到满足条件的记录,否则返回空。

RC隔离级别

它与RR隔离级别不同的是,RR隔离级别第一次查询后,生成的read view就不会变了,而RC则会在每一次查询的时候,重新生成read view;

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

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

相关文章

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

springboot之mybatisPlus多表查询及分页查询

文章目录 一、多表查询二、mybatis-plus条件查询三、分页查询 一、多表查询 可能会用到的注解 这里的场景是,查询每个用户及其所有的订单。就是查询你的id号的同时,把你所有的历史订单信息都拉出来。 表结构这样 CREATE TABLE User ( id INT PRIMARY…

Pytorch数据结构:GPU加速

文章目录 一、GPU加速1. 检查GPU可用性:2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算:6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…

Jetson nano部署Yolov8 安装Archiconda3+创建pytorch环境(详细教程+错误解决)

由于jetson nano 是aarch64架构,Anaconda官方不支持aarch64架构,所以有了一个叫“Archiconda”,其目的就是将conda移植到aarch64平台上 一. 下载地址Releases Archiconda/build-tools GitHub 然后安装archiconda bash Archiconda3-0.2.3…

stm32 HAL中断GPIO——1

1选择引脚为中断 中断详细配置 1 模式选择 上拉下拉 再点击NVIC可进行分组 再勾选如图 总结步骤 1选择中断 2配置时钟//选择外部时钟 3配置模式 4勾选NVIC

绝地求生:2024工资杯S2D2:单日前五队伍瓜分吃鸡,CCG暂居积分总榜首!

2024工资杯S2第二天小组赛结束,今日场上吃鸡和分数被CCG、17、AVG、PeRo、CTG这五支队伍瓜分,在XDD回归后,PeRo更是打出了单场20杀吃鸡大分局。 目前CCG以122分暂居小组积分榜首,AVG、MNG紧随其后,明日BC组&#xff0c…

【Linux】shell 脚本基础使用

在终端中输入命令可以完成一些常用的操作,但是我们都是一条一条输入命令,比较麻烦,为了解决这个问题,就会涉及到 shell 脚本,它可以将很多条命令放到一个文件里面,然后直接运行这个文件即可。 shell 脚本类…

STM32使用HAL库获取GPS模块HT1818Z3G5L信息(方法1)

1、写在最前 先了解一下GPRMC的格式 格 式: GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50 说 明: 字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data&…

【服务器部署篇】Linux下安装Docker容器

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

计算机网络——37认证

认证 目标:Bob需要Alice证明他的身份 Protocol ap1.0:Alice说"A am Alice" 可能出现的问题: 在网络上Bob看不到Alice,因此Trudy可以简单的声称他是Alice 认证:重新尝试 Protocol ap2.0:Alice…

继电器线圈两端为什么要反向并联二极管

原理描述: 电感的特点:穿过电感的电流不会突然变化,也就是说变化的电流在电感上面会产生感应电动势。 感应电动势的作用:阻碍电流的变化。 三极管断开之前,电流是穿过线圈,原来的电流是从上往下流动&#…

自定义实现shell/bash

文章目录 函数和进程之间的相似性shell打印提示符,以及获取用户输入分割用户的输入判断是否是内建命令执行相关的命令 全部代码 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&#…

数据结构和算法:分治

分治算法 分治(divide and conquer),全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。 1.分(划分阶段):递归地将原问题分解为两个…

C语言自定义类型变量——枚举(enum)

一.枚举的定义和声明 字面意思,枚举就是一一列举,把可能的取值一一列举,在我们现实生活中有许多可以列举的事物,例如:一周七天,一年四季,性别,月份,三原色等等。当我们需…

vim美化配置(懒人版)

文章目录 配置vim(懒人版)1.搜索资源2.安装3.自定义缩进4.卸载方法 配置vim(懒人版) 1.搜索资源 打开gitee,注意到上面的搜索框 搜索 vimforcpp 进入,找到安装方法中的链接 2.安装 复制粘贴到linux中的命…

【JavaWeb】Day36.MySQL概述——数据库设计-DDL(三)

查询 关于表结构的查询操作,工作中一般都是直接基于图形化界面操作。 1.查询当前数据库所有表 2.查看指定表结构 3.查询指定表的建表语句 注意:23版的点击导航中的转到DDL 修改 关于表结构的修改操作,一般也是直接基于图形化界面操作。 添…

Linux基础篇:Linux第三方软件仓库——可以让Linux变得有趣的软件仓库

Linux第三方软件仓库——可以让Linux变得有趣的软件仓库 一、epel源介绍 EPEL(Extra Packages for Enterprise Linux)源是一个由Fedora项目组维护的第三方软件仓库,为企业级Linux发行版(如Red Hat Enterprise Linux(…

2024年阿里云新购、升级及续费活动大全

随着云计算技术的不断发展和普及,越来越多的企业和个人开始选择将业务和数据迁移到云端。作为国内领先的云计算服务提供商,阿里云一直致力于为用户提供更加稳定、高效和安全的云服务。2024年,阿里云继续推出了丰富的新购、升级及续费活动&…

读所罗门的密码笔记12_群雄逐鹿(上)

1. 国际电信规则 1.1. 美国坚持互联网自由和极少的内容限制,这一立场肯定会遭到许多国家的反对 1.2. 除去两个各方针锋相对、无法妥协的议题,比如内容限制规定,实际上所有国家都已在打击垃圾邮件和常见网络安全威胁方…

【苍穹外卖】sql自动补全列名

第一步要设置IDEA与MySQL的链接 右侧的Database 加号 Data Source ----MySQL 填一下用户名密码就行,然后测试连接。可能会有时区问题,他让你点什么你就点 完了之后,他的表好像只有bank下面的那一个,要把所有的表都调出来&…