IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mysql行锁机制--未完 -> 正文阅读

[大数据]mysql行锁机制--未完

本篇只分析mysql在可重复读隔离级别的加锁机制

前置知识
对于行级锁,主要分为以下三类:

  1. 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
  2. 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
  3. 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

主要分为两个大的方向讨论
1.等值查询
2.范围查询

另,这两种情况又有多种的细分,等值查询可分为主键索引、唯一索引以及普通索引,每一种情况又包含命中和未命中,范围查询也一样

由于读分为当前读和快照读,而快照读实现为mvcc不加锁,只有当前读会加锁,所以只讨论当前读的范畴:select for update(更新和删除与此类似)或者select LOCK IN SHARE MODE

本文数据库版本号为5.7.30

我们使用下面这张 book 表作为实例,其中 id 为主键,ISBN(书号)为二级唯一索引,Author(作者)为二级非唯一索引,score(评分)无索引。

CREATE TABLE `book` (
	`id` INT(11) NOT NULL,
	`isbn` INT(11) NULL DEFAULT NULL,
	`author` INT(11) NULL DEFAULT NULL,
	`score` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE,
	UNIQUE INDEX `isbn` (`isbn`) USING BTREE,
	INDEX `author` (`author`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

在这里插入图片描述

最简单的情况:不使用索引
UPDATE book SET score = 9 WHERE score = 2
强调一点:间隙锁和间隙锁不冲突,所以这种情况下 select * from book where id =12 for update这个语句不会阻塞,但是insert into book values(12,12,221,2)这种插入语句会被阻塞,所以间隙锁只会阻塞插入请求,验证间隙锁的范围也只能通过插入验证
mysql加锁机制为锁索引,所以查询用不到索引的话,会直接锁表,
下面的请求直接阻塞:
select * from book where id =10 for update;(记录锁会相互阻塞)
insert into book values(12,12,221,2)
在这里插入图片描述
主键索引,等值命中
比如:select score from book where id = 20 for update;
其他事务所有id为20的查询写锁都被阻塞
(如:select score from book where id = 20 for update;)
结论:锁住主键20所在的B+树这一条记录

唯一索引,等值命中
比如:select isbn from book where isbn= 20 for update;
其他事务所有isbn为20的查询写锁都被阻塞
(如:select isbn from book where isbn= 20 for update;)
其他事务通过主键20的查询写锁也被阻塞
(如:select id from book where id = 20 for update;)
结论:锁住唯一索引20所在B+树的记录和主键20所在的B+树这一记录

普通索引,等值命中
比如:select id from book where author = 222 for update;
其他事务所有author为(111,333)区间的写锁都被阻塞
(如:select id from book where author = 222 for update;
insert into book values(60,60,221,2);
insert into book values(60,60,223,2);)
而insert into book values(60,60,333,2);insert into book values(1,60,111,2);可以成功,(一个问题:insert into book values(60,60,111,2);失败,包括其他值不变,主键为12,22,32,42,52都会失败???)

其他事务通过主键20的查询写锁也被阻塞
(如:select id from book where id = 20 for update;
select id from book where id = 30 for update;)
结论:锁住普通索引(111,333)所在B+树的记录和主键20、30所在的B+树的记录(主键锁住的值有问题)

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:15:14  更:2022-05-07 11:16:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:01:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码