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行锁加锁规则

概述:

行级锁加锁规则比较复杂,不同场景加锁形式不同,对记录加锁时,加锁的基本单位是next-key lock(左开右闭),其在不同的场景下会退化成间隙锁或者记录锁。通过以下实验来看看不同的场景具体是什么锁。
行级类型主要有三类:

Record Lock:记录锁,只在一条记录上机上锁;
Gap Lock:间隙锁,锁定某一个范围,不包含记录本身,左开右开;
Next-Key Lock:记录锁和间隙锁的组合,包含记录本身,左开右闭;
普通的select语句不会对记录加锁,需要加锁使用下面两种方式:

select ... lock in share mode;	//共享锁
select ... for update;	//独占锁

实验准备:

创建表:

create table user(
  id INT AUTO_INCREMENT,
  name VARCHAR(23) NOT NULL,
  age INT,
  primary key(id)
  )engine = INNODB default CHARSET = utf8;

插入一些数据:
在这里插入图片描述

唯一索引等值查询

会话1执行:查询一条存在的记录

begin;
select * from user where id = 7 for update;

执行以下语句查看加锁情况:

select * from performance_schema.data_locks\G;

在这里插入图片描述
我们重点关注第二行,第一行是因为插入了行级锁所以会生成一个表级别的意向锁。
上面红框是锁的属性主要信息

  • LOCK_TYPE:锁类型(RECORD:记录锁)
  • LOCK_MODE:X(独占锁),REC_NOT_GAP(记录锁,只锁一行)
  • LOCK_DATA:锁的值(主键索引id值为7的一条记录)

因此当查询条件是唯一索引等值查询且记录时存在的,只会锁住要查询的记录一条。

会话1执行:查询一条不存在的记录

begin;
select * from user where id = 8 for update;

在这里插入图片描述

  • LOCK_TYPE:锁类型(RECORD:记录锁)
  • LOCK_MODE:X(独占锁),GAP(间隙锁)
  • LOCK_DATA:锁的值(主键索引id值为11)
    因为是间隙锁,所以主键索引id的加锁范围是(7,11);

唯一索引范围查找

select * from user_2 where id >= 7 and id <10 for update;

在这里插入图片描述
由上图看出在id=7上加了一条记录锁。另外还有范围(7, 11)的间隙锁,所以加锁的范围是[7, 11)。

非唯一索引等值查询

首先给字段age加上索引;

查找的非唯一索引记录存在

select * from user_2 where age = 26 for update;

在这里插入图片描述
在这里插入图片描述

  • 首先给非唯一索引age_index加上next-key lock,范围(25, 26];
  • 使用非唯一索引,记录存在。还会加上间隙锁,规则是向下遍历一个区间,间隙锁范围(26,28)
    根据以上两点,使用普通索引且记录存在,会加上两个锁,分别是next-key lock(25, 26]和间隙锁(26,28)。

非唯一索引且值不存在

select * from user_2 where age = 23 for update;

在这里插入图片描述
非唯一索引不存在时,会在查找的值所在的区间加上间隙锁(20,25);

非唯一索引范围查找

select * from user_2 where age >= 20 and age < 24 for update;

在这里插入图片描述

在这里插入图片描述

  • 开始找的是age = 20,会加上next-key lock(18, 20],因为使用的不是唯一索引,索引不会退化为记录锁。
  • 由于是范围查找,向后一个区间走,到age = 25,加上next-key lock(20, 25],使用普通索引不会退化为间隙锁。
    综上所述,会产生两个next-key lock (18, 20] 和 (20, 25].

总结

行锁加锁的基本单位是next-key lock,只是会在不同的场景会退化为记录锁或者间隙锁

唯一索引等值查询

  • 记录存在,next-key lock退化为记录锁
  • 记录不存在,next-key lock退化为间隙锁

非唯一索引等值查询

  • 记录存在,除了next-key lock锁外,还会向后一个区间加上间隙锁,一共两把锁;
  • 记录不存在,只会加上next-key lock锁,再退化为间隙锁,只有一把锁;

范围查找

  • 唯一索引范围查找,如果查找的条件存在,则会有一条记录锁,然后会给后面的范围加上next-key lock(某些条件下会退化为间隙锁);
  • 非唯一索引范围查找,next-key lock 不会退化为记录锁或者间隙锁

另外,锁是在遍历索引的时候加上的,并不是针对输出结果加锁。因此当在线上执行update、delete、select…for update等有加锁性质的语句,需要判断语句是否走索引,如果是全表扫描的话,会对每一个索引加next-key lock,等于把整个表锁住了。

就是这事,散会。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:48:45  更:2022-10-08 20:49:06 
 
开发: 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/23 5:22:46-

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