MySQL8 行级锁

堵塞MySQL的会话是如何被快速杀掉的 查找Innodb里面的锁,可以通过information_schema库下相关事务表和锁相关信息表来查到,在8.0的环境下,通过sys库下的锁相关表查询。 阅读详情

MySQL8 INNODB行级锁

MySQL8 行级锁

版本:8.0.34

基本概念

行级锁(Row-Level Locking)是MySQL InnoDB引擎特有的特性,行级锁的粒度小,并发性能高,发生死锁的概率高。

从锁的兼容性角度来看,行级锁主要包含共享锁(S锁)和排他锁(X锁)。

  1. 共享锁(S锁):一个事务去加共享锁后,同时也允许其他事务读,但是排斥其他事务获取排他锁(X锁)
  2. 排他锁(X锁):一个事务加排他锁后,其他事务不允许加X锁,也不允许加S锁。
当前所类型\其他请求锁类型S锁X锁
S锁兼容互斥
X锁互斥互斥

不同的语句的会加上不同的锁,以下是加锁类型说明:

SQL记录锁类型
INSERT、UPDATE、DELETE、SELECT…FOR UPDATEX锁
SELECT(通用)不会加锁,快照读
SELECT…FOR SHARES锁

按照锁的粒度来划分,MySQL中行级锁主要有记录锁(Record Lock)、间隙锁(Gap Locks)、临键锁(Next-Key Locks)。

行级锁并非是将锁加到记录上,而是加到了索引上。

  • 记录锁(Record Lock):记录锁宏观上看确实是锁在了记录上,但实际上锁在索引上,当我们开启一个事务,使用SELECT...FOR UPDATE、INSERT、UPDATE、DELETE语句操作某些已经存在的记录上的时候,就会加上记录锁。
  • 间隙锁(Gap Locks):间隙锁是一种范围锁,锁定的是一个区间(左开右开),他的作用就是确保索引记录之间不能够插入值(Insert操作),避免产生幻读,在RR事务隔离级别下支持。间隙锁是为了避免幻读的发生。
  • 临键锁(Next-Key Locks)行锁和间隙锁的组合,同时锁住临界记录和间隙(左开右闭),在RR事务隔离级别下支持。

InnoDB引擎在RR事务隔离级别下使用临键锁搜索和索引扫描,从而防止幻读,该给索引记录上什么样的锁,要根据具体情况而定,不过MySQL都是首先考虑临键锁,根据不同的情况退化为记录锁或者间隙锁。

主键索引抽象图

在上图中显示表t1中有4条记录,主键分别是3、5、6、9,MySQL会根据这四个值构建一个聚簇索引,图中虚线部分是不存在的,但是这些地方就是数据索引中的间隙,加行级锁的时候就是考虑这些间隙,从而形成一套加行级锁的规则。

上面的数据临键锁的区域划分如下,此图特别重要!!! :

临键锁区域

行级锁的锁信息会被放入到performance_schema.data_locks中,可以通过查询该表来了解详细加锁情况,该表的列含义在文章MySQL8表级锁 - 超哥编程说 (programtalk.cn)中已经说过,这里不再做赘述。

SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME, LOCK_TYPE, LOCK_MODE, LOCK_STATUS, LOCK_DATA FROM performance_schema.data_locks;

准备数据

mysql> CREATE TABLE `t1` (
    ->   `id` int NOT NULL AUTO_INCREMENT,
    ->   `name` varchar(10) NOT NULL,
    ->   `id_nbr` varchar(19) DEFAULT NULL,
    ->   `age` int NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   UNIQUE KEY `idx_uk_id_nbr` (`id_nbr`),
    ->   KEY `idx_name` (`name`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Query OK, 0 rows affected (0.02 sec)
​
mysql> insert into t1 values(3, '刘备', '110101193007282815', 93), (5, '孙权', '110101194007281016', 93), (6, '曹操', '110101191807288714', 95), (9, '王朗', '110101190007287516', 123);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0
​
mysql> select * from t1;
+----+--------+--------------------+-----+
| id | name   | id_nbr             | age |
+----+--------+--------------------+-----+
|  3 | 刘备   | 110101193007282815 |  93 |
|  5 | 孙权   | 110101194007281016 |  93 |
|  6 | 曹操   | 110101191807288714 |  95 |
|  9 | 王朗   | 110101190007287516 | 123 |
+----+--------+--------------------+-----+
4 rows in set (0.00 sec)

我准备了一个表t1,id是主键,姓名name(二级非唯一索引),身份证号(唯一索引),年龄age无索引。

开始验证

在开始验证之前,我们再次强调下:InnoDB引擎在RR事务隔离级别下使用临键锁搜索和索引扫描,从而防止幻读,索引当分析一个SQL加什么行级锁的时候要使用考虑以下几件事:

  1. 临键锁区间情况

    临键锁区域

  2. 通过条件确定索引数据范围,判断命中了哪些临键锁区间。

  3. 判断是否可能退化为记录锁或者间隙锁。

聚簇索引

InnoDB引擎以临键锁搜索和索引扫描,完全匹配临键锁区间的时候,就使用临键锁,否则考虑是否退化成为记录锁或者间隙锁。多个临键区间单独考虑加锁情况。

开始验证:

select * from t1 where id <= 3 for update;

select * from t1 where id <= 3 for update;

此时命中的临键区间的关系如下图:

命中情况

此时正好命中临键锁 (-∞, 3] ,数据范围也正好与临键锁 (-∞, 3] 完全匹配,最终就会加上临键锁。

查看下锁:

临键锁

第二行中,LOCK_DATA=X, LOCK_DATA=3说明此锁是一个临键锁,临键值(最近最大上限)= 3。

临键锁范围内是不允许插入数据的,临键值是不允许修改(删除)的,比如不允许插入id=2的记录,也不允许修改(删除)id=3的记录

不允许插入id=2的记录

不允许修改(删除)id=3的记录

如果查询条件是是id < 3那么临键锁就会退化为间隙锁。

select * from t1 where id < 3;

image-20230726170335233

id < 3所在的临键锁区是 (-∞, 3]

命中情况

当时条件中不包含上界值3,所以退化为间隙锁。

锁信息如下图:

退化为间隙锁

如果查询条件变为id = 3则临键锁要退化为记录锁

select * from t1 where id = 3 for update;

查id=3的记录查看下临键区间命中情况,id = 3会命中临键区是 (-∞, 3]

命中情况

但是查询条件中只有3,那么就无需负无穷区,所以此时临键锁就退化为记录锁,最终只锁定3的索引记录。

查看下锁信息:

记录锁

图中第一行是一个意向共享锁,本篇幅不讲解,第二行是行锁的记录,其INDEX_NAME=PRIMARY代表是对主键索引进行加锁,LOCK_TYPE=RECORD代表此锁是行级锁,LOCK_MODE=S,REC_NOT_GAP代表此锁是一个行锁、共享锁,不是一个间隙锁,LOCK_DATA=3代表此锁锁的数据是索引key=3,印证了分析和结果是一致的。

引擎对索引key=3加了S锁、记录锁,所以其他会话只能获取S锁,不能无法获取X锁。 下图为兼容性测试:

其他会话只能获取S锁,不能无法获取X锁

如果查询一个不存在的记录,那么引擎会找比当前条件主键值大且最近的索引记录,比如查询条件是id = 7。

select * from t1 where id = 7 for update;

查id=7的记录,此记录不存在

上图中查询id=7的记录,但是此记录不存在,索引继续向后搜索临键,最终得到9这个临键,最终引擎确定7所在的临键区是 (6, 9]

命中情况

但是查询条件里没有9,因此退化为间隙锁,锁得范围就确定为(6,9) ,也就是对7和8的索引记录加锁,主键为7和8是不允许插入记录的。

查看锁记录验证下:

锁信息

图中第一行是一个意向共享锁,本篇幅不讲解,第二行是行锁的记录,其INDEX_NAME=PRIMARY代表是对主键索引进行加锁,LOCK_TYPE=RECORD代表此锁是行级锁,LOCK_MODE=X,GAP代表此锁是一个行锁、排他锁,GAP代表是一个间隙锁,LOCK_DATA=9代表此锁的上边界索引Key是9(实际锁的范围中不包含9)。

此间隙锁的范围是(6,9), 故而id=7和id=8的记录无法被Insert,再开启一个会话来验证下id=7和id=8这两个记录能否被插入到表中。

id=7无法插入间隙

查看下锁信息:

查看锁状态

LOCK STATUS=WAITING说明确实无法插入id=7的记录。

那么id=8的记录是不是也无法插入呢?

id=8的记录无法插入到间隙

没错确实能够正常插入。

等值查询、记录不存在,并且上边界索引Key值不存在的时候呢,会加什么锁呢?比如我操作id=10的记录。

id=10

查询条件id=10所在的临键区间,命中情况如下:

命中情况

没有边界问题,所有无需退化,使用临键锁(这个临键锁比较特殊,它的上界值是supremum pseudo-record,并不存在于索引树中)

supremum pseudo-record

那么索引key大于9的记录都不允许被Insert,比如下图中id = 10的记录是无法插入的。

id=10不允许插入

在测试给id = 100的记录,也是无法被插入,看下图:

id=100不允许插入

那么id=9这个B+树中最大的主键值能够修改吗?答案是能,左开区间嘛。

image-20230723215151541

再看一个跨区间的情况,比如id <= 4。

select * from t1 where id <= 4;

id < 4

id < 4命中的临键区如下图:

命中情况

此时命中了两个临键区 (-∞, 3] 和 (3, 5] ,第一个临键区不会退化,所以会加上一个上界=3的临键锁,对于第二个临键区,查询条件中不包含5,所以退化为间隙锁 (3, 5) .

查看加锁情况:

加锁情况id=4的记录无法Insert的,看下图:

image-20230725131709769

有一个比较特殊的情况存在,有人说这是一个BUG,当条件是id > 6 and id <= 9的时候

select * from t1 where id > 6 and id <= 9 for update;

id > 6 and id <= 9

临键区命中情况应该如下(实际上下图是错的):

命中情况

此时正好命中键区 (6, 9] ,应该加上一个临键锁即可(实际上并不是这样!!! )

查看锁信息:

锁信息

可以看到了还有一个LOCK_DATA=supremum pseudo-record的临键锁,supremum pseudo-record的意思是伪记录。

很奇怪,对不对?这是因为:唯一索引上的范围查询,如果记录中的最大值在查询范围内,会访问到不满足条件的第一个值(这个值其实就是supremum pseudo-record)为止。),插条条件是id <=9 ,这个9就是最大索引记录值,并且在查询条件值,所以当扫描到9之后,还会继续向后扫描。先后扫描就进入了(9, +∞)这个临键区了,并且还不会退化。

如此,命中临键区间就变为了下图:

命中情况

LOCK_DATA=supremum pseudo-record并非只有上述情况才会出现,当id > 9这个B+树中最大索引键值的时候也是会出现的

select * from t1 where id > 9

select * from t1 where id > 9

二级唯一索引

二级唯一索引聚簇索引都是使用临键锁区搜索和索引数据。使用id_nbr字段作为查询条件id_nbr字段创建索引的时候默认使用的升序,并且排序字符集是utf8mb4_0900_ai_ci。通过id_nbr字段来升序排列后,顺序如下:

id_nbr升序

根据上图可以知道一个B+树叶子节点图大致如下(为了便于理解,我增加了很多空隙)。

临键锁区域

为什么会有这么多空隙呢?这是有因为数据类型是字符串的,那么字符串与字符串之间肯定能够再放入其他字符串,比如110101190007287516和110101190007287517之间,就可以放入类似110101190007287516XXXX任意多X的数据(不超过字段长度)。

因此也就能获取到如上图中所示的临界区。

非聚簇唯一索引范围查询:InnoDB存储引擎使用临键锁搜索数据,会搜索到下一个不满足条件的索引KEY,如果进入到下一个临键区,则会将下一个临键区加上临键锁(任何时候都不会退化,这跟主键索引是不同的)

开始验证:

select * from t1 where id_nbr <= '110101190007287516' for update;

select * from t1 where id_nbr <= '110101190007287516' for update;

命中临键区如下:

命中临键区

第一个临键区被命中没有问题,数据也确实在这个范围内,但是第二个临键区为什么也命中了呢?

这是因为非聚簇唯一索引,InnoDB存储引擎使用临键锁搜索数据的时候,会搜索到下一个不满足条件的索引KEY,下一个Key肯定是大于110101190007287516的,那么就进入了后面的临键区(110101190007287516, 110101191807288714]中,对该临键区加临键锁

所以就命中了两个临键区。查看锁情况:

锁情况

可以看到有四个锁,第一个锁是意向排他锁,略过。第二行和第三行是两个临键锁,不同于聚簇索引,非聚簇索引的LOCK_DATA会记录索引的值,以及该记录对应的主键值。

特别要注意的是,第四行还加了一个聚簇索引树中的记录锁,LOCK_DATA=9。因为条件中有等值条件且查询到记录。

已经对非聚簇唯一索引加了临键锁,为什么还要对聚簇索引加记录锁呢?首先我们应该知道非聚簇索引树与聚簇索引树并不是一棵树,如果有其他事务执行delete from t1 where id_nbr = '110101190007287516'或者是delete from t1 where name = '王朗',那么首先要在非聚簇索引上找到记录的主键id,然后表,更新id=9的记录,如果不对主键索引加锁,并发操作就能通过id_nbr之外的条件修改id_nbr = '110101190007287516'的记录。


如果去掉等号,那么临键锁搜到到110101190007287516就会停止,虽然条件中不包含110101190007287516,但是临键锁不会退化。

select * from t1 where id_nbr < '110101190007287516' for update;

select * from t1 where id_nbr < '110101190007287516' for update;

引擎会使用临键锁搜索索引数据,搜索到id_nbr = '110101190007287516'的时候停止,不会继续想后搜索,所以只会命中一个临建区,查询条件中的110101190007287516正好是该区域的上界值,所以不会退化为间隙锁。

命中情况

查看锁情况:

锁情况

验证了确实不会退化。


如果条件只是等于一个已经存在的记录110101190007287516,则会退化为记录锁。

select * from t1 where id_nbr = '110101190007287516' for update;

select * from t1 where id_nbr = '110101190007287516' for update;

查询条件命中临键区情况如下:

命中情况

等值查询,不会继续向下搜索第一个不满足条件的索引,并且不锁住(-∞, 110101190007287516)左开右开区间也不会导致幻读问题,所以临建锁退化为记录锁。

锁情况如下:

记录锁

有两个记录锁,一个是非聚簇唯一索引的记录锁,另外一个是该记录对应的聚簇索引中的记录锁。


如果等值查询,记录不存在的时候呢?比如查询id_nbr = '110101190007287515',则会退化为间隙锁。

select * from t1 where id_nbr = '110101190007287515' for update;

select * from t1 where id_nbr = '110101190007287515' for update;

命中临键区情况如下:

命中情况

110101190007287515不存在,临建区(-∞, 110101190007287516]中的110101190007287516不在查询条件中,所以退化为间隙锁。

查看锁情况:

退化为间隙锁

确实是间隙锁。


id_nbr > '110101194007281016’的时候(110101194007281016是索引树中最大的索引KEY)

select * from t1 where id_nbr > '110101194007281016' for update;

image-20230726180140232

那么命中临键区情况如下:

命中情况

此时正好命中一个临建锁区间,加临建锁。

查看锁情况:

加临建锁


如果在上面的查询条件id_nbr > '110101194007281016'加上等号,变为id_nbr >= '110101194007281016'会加什么样的锁呢?

select * from t1 where id_nbr >= '110101194007281016' for update;

select * from t1 where id_nbr >= '110101194007281016' for update;

此时临键区命中情况为

命中情况

命中了两个临键区,所以会加上两个临建锁,因为会查出来id=5的记录,防止修改,会加上主键索引树中索引key=5的记录锁。

查看锁情况:

锁情况

没错,确实如此。

二级普通索引

首先来看下表数据:

image-20230726190347958

表中name是普通索引,中文排序不太容易观察,为了演示方便,将name字段改为拼音。

mysql> update t1 set name = 'liubei' where id = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
​
mysql> update t1 set name = 'sunquan' where id = 5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
​
mysql> update t1 set name = 'caocao' where id = 6;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
​
mysql> update t1 set name = 'wanglang' where id = 9;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

修改后数据如下:

表数据

这个表中name字段的普通索引树以及临建锁区域如下:

临键锁区域

开始验证:

select * from t1 where name <= 'caocao' for update;

select * from t1 where name <= 'caocao' for update;

首先会命中临键区 (-∞, caocao] ,依然会继续向下搜索(找到第一个不等于caocao的索引),会命中第二个临键区 (caocao, liubei] ,所以会加两个二级索引的临键锁,并且caocao对应的记录是存在的,也需要给这个记录加一个聚簇索引中的记录锁。

命中情况

锁情况如下:

image-20230726191227814

如果查询条件不包含等号,也就是变为name < 'caocao'呢?

select * from t1 where name < 'caocao' for update;

select * from t1 where name < 'caocao' for update;

命中临键区情况如下图:

命中情况

引擎扫描到caocao就停止了,不会进入下一个临键区,所有只需要加一个临键锁即可。

查看锁情况:

image-20230726193800152

确实如此。

如果是等值查询caocao呢?

select * from t1 where name = 'caocao' for update;

select * from t1 where name = 'caocao' for update;

正常来说他会命中临键区 (-∞, caocao] ,然后退化为记录锁:

命中情况

但是实际情况并非如此,假设我们只锁定上图中的绿色部分,这能解决幻读问题吗?不能!!!,为什么呢?因为name的索引是普通索引,在索引树中name的值是允许重复的,那么我在上图绿色部分左右间隙插入name=caocao的数据是一定能够插入的,这就出现了幻读,解决办法就是将两侧的间隙锁住,此时命中临键区的情况就变为了下图如下:

命中情况

那么第一个临建锁不退化,第二个退化为间隙锁。

锁情况如下:

锁情况

如果等值查询,但是记录不存在呢?

select * from t1 where name = 'caocaa' for update;

select * from t1 where name = 'caocaa' for update;

命中临键区 (-∞, caocao] 。

命中情况

但是查询条件中并未出现caocao索引KEY,所以退化为间隙锁。

锁情况如下:

退化为间隙锁

总结

  1. MySQL InnoDB中的行级锁,优先使用临键锁,根据情况退化为间隙锁和记录锁。
  2. 索引上的等值查询,如果记录不存在,则优化为间隙锁,但是当记录索引KEY值大于B+树中最大索引KEY的时候,依然保持临建锁,临键值=supremum pseudo-record。
  3. 对于聚集索引,范围查询,如果查询条件中包含临键值(临键区最大索引值)的时候,保持临键锁,否则退化为间隙锁。
  4. 普通索引等值查询时,如果索引记录存在,会在二级索引上加该索引前间隙加临键锁和后间隙退化为间隙锁,在聚簇索引上对该索引记录加记录锁。
  5. 二级索引,会访问到第一个不满足条件的值为止。
海康威视GigE工业相机的python调用demo 默认路径安装完成后,在路径C:\Program Files (x86)\MVS\Development\Samples\Python\BasicDemo下的BasicDemo.py中,海康威视官方提供了基本的调用方法,本文也是基于这个修改的。BasicDemo.py提供了通过枚举选择相机的方法,在官方的另一个DEMO:ConnectSpecCamera.py中提供了另一种不通过枚举,直接访问特定IP相机的方法,也可以参考。另外,如果每台相机都定义了唯一的用户定义名,也可以通过用户定义名来区分相机。 阅读详情

相关推荐

从零配置到稳定运行:A4988步进电机驱动模块的实战避坑指南

本文详细介绍了A4988步进电机驱动模块的配置与优化技巧,涵盖硬件连接、电流调节、微步设置及散热优化等关键环节。通过实战经验分享,帮助用户避开常见陷阱,实现步进电机的稳定运行,特别适合单片机开发者和3D打印机爱好者参考。

weixin_28452161的博客 165

深入分析MySQL行锁加锁规则

之前的一篇文章中总结了一下MySQL中的MVCC,它主要利用隐藏字段、版本链、ReadView来实现,可以用来更好地解决多个事务的并发【读+写】问题,但是如果在多个事务并发【写+写】的情况下,就必须要用到锁了,一般情况下,数据库的锁都是在有数据库操作的过程中自动添加的。MySQL提供了很多种锁:Server层实现了全局锁和元数据锁。数据引擎中,MyISAM、Memory等存储引擎实现了表锁(且只支持表锁),BerkeleyDB存储引擎实现了页级锁,InnoDB实现了行锁和表锁。

qq_39745899的博客 2692

Remosaic 算法

在 4in1 传感器中,相邻的 4 个同色像素(如 4 个红色、绿色或蓝色像素)合并为 1 个“超级像素”,以提升低光环境下的感光能力。例如,在 RGGB 排列中,每个 2x2 的 Quad 单元需要恢复为 4 个独立的 R、Gr、Gb、B 像素1。:传感器通过硬件级 Remosaic 直接输出 4800 万像素的原始数据,每个像素独立记录颜色信息,解析力更高2。:传感器仅输出 1200 万像素数据,再通过软件算法插值放大到 4800 万像素,实际解析力无本质提升2。的原始数据转换为传统。

Damon_X的博客 3725

0401锁详解-MySQL-数据库

0401锁详解-MySQL-数据库

gaogzhen的博客 1003

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 229

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

MYSQL 8.0 -- 事务中删除不存在的记录导致死锁

死锁

zhangdm的博客 2583

Flask基础项目:从零到一搭建用户管理系统

本文介绍了一个基于Flask的用户管理系统,具有完整的增删改查功能。系统采用SQLAlchemy ORM进行数据库操作,自动处理SQL注入并首次运行时创建表结构。主要特点包括:实时统计用户总数和平均年龄、智能即时搜索、前后端双重数据验证、邮箱唯一性检查、流畅动画效果和响应式设计。后端使用Flask框架实现RESTful API,前端采用现代化UI设计,支持异步操作不阻塞界面。系统安装简单,只需创建数据库并安装依赖即可运行,适合作为基础用户管理系统的参考实现。

数据知道的博客 3837

MySQL InnoDB supremum pseudo-record范围说明

在 MySQL InnoDB 存储引擎中,锁机制是保证数据一致性和事务隔离的重要手段之一。InnoDB 引入了多种锁机制,其中 next-key lock 是实现行锁和间隙锁的关键部分。在 next-key lock 的机制中,supremum pseudo-record 是一个特殊的存在,通常被描述为 “正无穷大” ,用于表述索引记录中最大值之后的间隙。然而,在实际应用中,supremum pseudo-record 的行为并非总是符合这一描述。

随风飘流的博客 1103

彻底解决JDK安装包点击后无反应

jdk双击无法安装,jdk双击没反应,jdk安装包双击后没反应。

renkai721的专栏 8938

SAP 经营范围(Operating Concern) 和业务范围 (Business Area) 在核算架构或是管理架构中的区别和联系分别是什么 请给具体的示例

摘要:SAP系统中,业务范围(Business Area)和经营范围(Operating Concern)在核算架构中具有不同功能。业务范围是FI/CO共用维度,用于跨公司码的业务线核算(如电子产品、机械设备),支持内部管理和简单对外报表。经营范围则是CO-PA专属维度,聚焦获利能力分析,可细化到产品+客户+区域组合(如分析手机在华东区域的获利情况)。两者存在层级关联:经营范围包含业务范围作为基础维度,业务范围数据会传递至经营范围进行深度分析。实际应用中需先配置业务范围,再设置经营范围并关联相关维度,共同支

金牌架构师 94

mysql8行级锁学习

mysql8行级别锁是锁在索引上的,如果sql语句没有用到索引,则会锁表; 例如: session1执行如下sql语句: set autocommit=0; select * from tab_no_index where id = 2 for update; id列没有索引; session2执行如下sql语句: select * from tab_no_index where id = 1 for update; 则会一直处于等待中,因为没有索引,虽然查询的不是一行数据,但会触及表级锁,sessio

828

华为OD机试真题 新系统 2026-08-16 Python&JS【智能家居模式调度优化】

智能家居系统中有多个自动化联动模式,每个模式 modes[i]=[start_time,end_time,power],表示它在左闭右开区间 [start_time,end_time) 内持续消耗固定功率 power。

MISAYAONE的博客 85

mysql行级锁检测_【MySQL】行级锁的验证(第一篇)(正常的并发读写)

知识储备那么久,该来点有深度的【原创】了!深思了一会发现MySQL的行级锁一两篇竟然本渣竟然讲不明白个所以然所以分多篇讲述:本篇主要说明正常简单系统并发预估是1K上下的QPS。普通的4C8G独立MySQL数据库,经测试可能承受2K-3K的并发读写,测试中也有很多因素影响,服务器硬盘是机械或者SSD,linux系统的IO调度算法,最大文件句柄数,Buffer Pool调优,数据库中的表,行溢出......

weixin_33274610的博客 174

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MySQL 8.0存储引擎解析

My SQL 8.0存储引擎解析 MYISAM 存储引擎 MyISAM基于旧的(并且不再可用)ISAM存储引擎,但有许多有用的扩展。 每个MyISAM表被存储在磁盘中的两个文件中。这些文件具有以表名开头的名称,并有一个扩展来指示文件类型。数据文件具有.MyDD(MyDATA)扩展名。索引文件具有.MyI(MyIndex)扩展名。表定义存储在MySQL数据字典中。 MyISAM表具有...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 2064

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Mysql】Mysql8存储引擎优化与锁和事务管理优化

在MySQL 8中,存储引擎的优化、锁和事务管理的优化对于提高数据库性能和确保数据完整性至关重要。

IT深耕十余载,大道之简 600

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Bohrium MySQL8面试题

深入理解 MySQL 8 在索引优化、事务控制、数据操作及并发处理方面的关键改进,不仅有助于应对高级数据库岗位的选拔,也对实际系统设计具有指导意义。推荐使用单调递增的整型字段(如自增 ID),避免采用易变或过长的业务字段作为主键,以防引发频繁的索引分裂与页重组,影响写入性能和存储效率。传统情况下,若查询条件未覆盖联合索引的最左前缀,则无法有效利用该索引。而索引跳跃扫描突破了“最左匹配”原则的限制,允许优化器在某些场景下跳过前导列,直接访问后续索引列的数据分布,从而提升非前缀匹配查询的执行效率。

m0_37843156的博客 187

2022最新MySQL面试题-有详细完整的答案解析

MySql专题面试题,看看你能搞定几个

波波烤鸭的博客 1612

MYSQL锁机制 - 锁的简述 | 索引对行级锁的影响

MYSQL锁机制 - 锁的简述 | 索引对行级锁的影响

假人一个的博客 1855

MySQL 当中的锁

对 MySQL 当中的锁机制进行学习。

YGGP的博客 1164

java面试之Mysql基础二

java面试之Mysql基础二 目录java面试之Mysql基础二1.架构体系架构网络连接层服务层存储引擎层系统文件层运行机制查询缓存参数查看存储引擎InnoDB 存储结构内存结构Buffer PoolChange Buffer自适应hash索引Log Buffer磁盘结构表空间数据字典双写缓冲区Redo LogUndo Logsmysql8.0 版本存储引擎InnoDB 数据文件Undo Log作用Redo Log工作原理参数设置Binlog文件结构记录模式文件操作场景Redo Log 和 Binlog

ymn159的博客 319

MySQL 8.0——存储引擎

MySQL逻辑架构采用SQL层和存储引擎分离的方式,真正实现了数据存储和逻辑业务的分离。MySQL的SQL层从宏观上可以分为3层,事实上SQL层包含了很多子模块,下面就详细介绍SQL层各个子模块的功能。MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。

吴声子夜歌的博客 351

Mysql 行级锁无索引时变表级锁,真的是这样吗?实测

最近学习Mysql时,发现网上往往说行级锁没有使用索引时会转为表级锁,原因是Mysql行级锁是给索引加锁。但事实真的是这样吗?自己测试了下,发现了一些问题 经测试 测试用表: employees( id INT(11) NAME VARCHAR(15))无索引 session1 begin; select * from employees where id =1 lock in share mode; session2 begin; update employees set name = ‘tom’ w

qq_34207811的博客 2089

MySQL行级锁初探

MySQL行级锁初探 版本:8.0.29 最近研究MySQL行级锁发现一个有趣的东东。 正常情况下,对于表级锁来说,对于会话持有某个表的锁(无论什么类型),可以在performance_schema.metadata_locks中查到会话持有锁的信息。 而对于会话对表的DML操作涉及的每一行,竟然都能在数据字典performance_schema.data_locks中查询到持有行锁的会话信息,...

PiscesCanon的博客 104

【MySQL】MySQL存储引擎,索引,锁以及调优

索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。通过 Explain 分析发现表中有多个索引,MySQL 的优化器选用了错误的索引,导致查询效率偏低,然后通过在 SQL 语句中使用 use index 来指定索引解决。图中看到:Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。行级锁开销大,加锁慢,有可能会出现死锁,不过因为锁定粒度最小,发生锁冲突的概率低,并发访问效率比较高。

小冷coding的博客 1282

MySQL 的全局锁、表锁和行锁

在前一篇文章我讲了下 MySQL 的全局锁、表记锁和行级别锁,其中行级锁只提了概念,并没有具体说。因为行级锁加锁规则比较复杂,不同的场景,加锁的形式还不同,所以这次就来好好介绍下行级锁。对记录加锁时,,它是由记录锁和间隙锁组合而成的,。但是,next-key lock 在一些场景下会退化成记录锁或间隙锁。那到底是什么场景呢?今天,我们就以下面这个表来进行实验说明。其中,id 是主键索引(唯一索引),b 是普通索引(非唯一索引),a 是普通的列。注意,。

u010830473的博客 1504
上一篇: MySQL8表级锁
下一篇: 【数据结构与算法】二分查找法
「已注销」
博客等级 码龄3年 128粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值