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的行锁和间隙锁

无论是update还是select for update,只要where条件里面字段没有带索引,都会把整个表锁住。如果更新的行上存在索引,更新时锁定被更新的记录。

1、行锁

测试:
item表, 在id、price字段上加锁。
在这里插入图片描述
打开两个窗口。 分别关闭自动提交:set autocommit=0;
?

1.1、字段存在索引,行锁

a窗口执行:

update item2 set stat = 1 where price = 1500;

b窗口执行:

update item2 set stat = 1 where price = 30;

在这里插入图片描述
由于price字段存在索引,a窗口的更新语句只锁定了price=1500的一条记录。b窗口正常更新price=30的记录。
?

1.2、字段不存在索引,表锁

a窗口执行:

update item2 set stat = 1 where name= 'dd';

b窗口执行:

update item2 set stat = 1 where price = 'ee';

在这里插入图片描述
由于name字段没有索引,a窗口where限定中name=‘dd’, 没有commit之前, b窗口查询name=‘ee’ 的记录还是被阻塞了。所以如果字段没有索引,在更新时会执行表锁。

?

1.3、联合索引的情况

新建一个name, address, port三个字段上的联合索引

create index index_name_address_port on item2(name,address,port);

在这里插入图片描述

1.3.1、联合索引生效的情况

a窗口执行:

update item2 set stat=1 where name = 'cc4' and address='张家村';

b窗口执行:

 update item2 set stat=1 where name = 'ff' and address='bcbc';

在这里插入图片描述
联合索引只要where查询索引生效,依然只会锁定行,不会影响其他行的更新。
?

1.3.2、联合索引没生效的情况

a窗口执行:

update item2 set stat=1 where address='张家村' and port='67';

b窗口执行:

update item2 set stat=1 where address='bcbc' and port='24';

在这里插入图片描述
如果where条件中的联合索引失效,依然会锁定整张表。

联合索引生效条件

Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

?
?

2、间隙锁

行锁的一种特殊情况:间隙锁:值在范围内,但却不存在
a窗口执行:

 update item2 set stat = 1 where price>100 and price<400;

b窗口执行

 INSERT INTO `item2` VALUES (12, 'gt', 'vxc', 234, 288, NULL, NULL);

c窗口执行:

update item2 set stat = 1 where price = 300;

在这里插入图片描述
在这里插入图片描述
a窗口执行后,b,c窗口都阻塞了。 说明(100,400)的记录都被锁住了。无法插入price在100-400之前的记录, 即使price=288的记录还不存在,可以避免幻度。也无法更新100-400之前已经存在的记录。

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

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