绵阳网络公司网站建设,wordpress怎么安装好了,无安全警告的浏览器,医院网站建设企业概述
通常用的mysql都是innodb引擎#xff1b; 一般在update的时候用id都会认为是给行记录加锁#xff1b;
在使用非唯一索引更新时#xff0c;会遇到临键锁#xff08;范围锁#xff09;#xff1b; 临键锁和表中的数据有关#xff1b;
mysq版本:8 隔离级别#xf…概述
通常用的mysql都是innodb引擎 一般在update的时候用id都会认为是给行记录加锁
在使用非唯一索引更新时会遇到临键锁范围锁 临键锁和表中的数据有关
mysq版本:8 隔离级别RR可重复读
mysql的lockMode
查看锁的活动信息
-- 当前活动的锁信息
SELECT * FROM performance_schema.data_locks;X,REC_NOT_GAPX代表排他锁REC_NOT_GAP代表行锁。综合起来就是对这条数据索引项添加了行级排他锁;IX意向排它锁。上述案例中给表添加了一个意向排它锁。当其他事务要对全表的数据进行加锁时那么就不需要判断每一条数据是否被加锁了。X,GAP:X代表排他锁GAP代表间隙锁前开后开,即当前的lock_data中的索引值对应的id到最近的上一个id值之间的空隙被锁定了supremum pseudo-record 是 InnoDB 中定义的一种特殊记录我们可以理解为 ∞
X,GAPdemo说明
假设表中的数据如下,age有普通BTree索引然后事务1更新其中age为24的数据 可以看到age24对应的id3加上了X排它锁,id3的加上了行级排它锁然后对age24后面的age索引加了一个排他间隙锁锁住了id范围为(3,5)时间的间隙;
综上获得了id范围为[3,5)之间的锁
-- 事务1操作
UPDATE user SET name Vladimir WHERE age 24;临键锁
假设有如下表且表中数据如下
-- 表结构如下
CREATE TABLE user (id int NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(255) DEFAULT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,PRIMARY KEY (id),KEY idx_age (age)
) ENGINEInnoDB COMMENT用户表;捞点网图,间隙锁可以看做一个左开右闭的区间 那么在事务A中执行sql; 先select查询查询到age24的记录然后继续向后查询发现后一条是age32,age不等于24向后查询结束所以在获取间隙锁(24,32]同时当前age24的记录会加上排它锁;
然后再向前查询前一条记录是age10不等于24向前查询结束然后会获取(1024]的间隙锁;
综上所述INNDB加锁首先定位到等于或者第一个大于目标值的叶子节点
事务A
-- 根据非唯一索引列 UPDATE 某条记录
UPDATE user SET name Vladimir WHERE age 24;
-- 或根据非唯一索引列 锁住某条记录
SELECT * FROM user WHERE age 24 FOR UPDATE;在事务B中执行sql会遇到间隙锁会阻塞
INSERT INTO user VALUES(100, Ezreal, 30);试验结果如下
-- 当前活动的锁信息
SELECT * FROM performance_schema.data_locks;