当前位置:网站首页>mysql的行锁和间隙锁
mysql的行锁和间隙锁
2022-08-01 05:29:00 【孤独者的狂欢】
无论是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之前已经存在的记录。
边栏推荐
- 微信小程序获取手机号phonenumber.getPhoneNumber接口开发
- 【音视频】srs直播平台搭建
- pytorch、tensorflow对比学习—功能组件(优化器、评估指标、Module管理)
- Code Interview Guide for Programmers CD15 Generating an Array of Windowed Maximums
- 第5章——以程序方式处理MySQL数据表的数据
- 字符中的第一个唯一字符
- state compressed dp
- pytroch、tensorflow对比学习—功能组件(数据管道、回调函数、特征列处理)
- LeetCode 27. 移除元素
- Selenium:下拉框操作
猜你喜欢

2022/07/29 入职健海JustFE团队,我学到了高效开发(年中总结)

HJS-DE1/2时间继电器

(Codeforce 757) E. Bash Plays with Functions

About making a progress bar for software initialization for Qt

零序电流继电器器JL-8C-12-2-2

(more than 2022 cattle school four) A - Task Computing + dynamic programming (sort)

2022年超全的Android面经(附含面试题|进阶资料)

Robot growth in China

The solution to the inconsistency between the PaddleX deployment inference model and the GUI interface test results

DL-31/6电流继电器
随机推荐
深度比较两个对象是否相同
(Codeforce 757) E. Bash Plays with Functions
Selenium: Element wait
2022.7.26 Mock Competition
JWL-11/2-99.9A电流继电器
NUMPY
备战金九银十,如何顺利通过互联网大厂Android的笔面试?
Selenium:鼠标、键盘事件
MySQL Practice Summary -
pytorch、tensorflow对比学习—计算图和微分机制
y83. Chapter 4 Prometheus Factory Monitoring System and Actual Combat -- Advanced Prometheus Alarm Mechanism (14)
(more than 2022 cattle school four) A - Task Computing + dynamic programming (sort)
matplotlib pyplot
(2022牛客多校四)K-NIO‘s Sword(思维)
2022.7.27 Selected lectures on good topics
Selenium:元素定位
「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader
NUMPY
【翻译】确保云原生通信的安全:从入口到服务网及更远的地方
MySQL-Data Operation-Group Query-Join Query-Subquery-Pagination Query-Joint Query