MySQL进阶45讲【20】为什么只改一行的语句,锁这么多? 阳光穿透心脏的1/2处 2024-05-07 22:26 106阅读 0赞 ## 1 前言 ## 在上一篇文章中,主要介绍了间隙锁和next-key lock的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。 所以今天,我们就先从这个加锁规则开始吧。 在总结之前, 有几个规则需要说明一下,这个规则有以下两条前提说明: 1. MySQL后面的版本可能会改变加锁策略,所以这个规则只限于截止到现在的最新版本,即5.x系列<=5.7.24,8.0系列 <=8.0.13。 2. 如果大家在验证中有发现bad case的话,请提出来,会再补充进这篇文章,使得一起学习本专栏的所有同学都能受益。 因为间隙锁在可重复读隔离级别下才有效,所以本篇文章接下来的描述,若没有特殊说明,默认是可重复读隔离级别。 总结的加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。 1. 原则1:加锁的基本单位是next-key lock。希望你还记得,next-key lock是前开后闭区间 2. 原则2:查找过程中访问到的对象才会加锁。 3. 优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁。 4. 优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。 5. 一个bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。 还是以上篇文章的表t为例,和你解释一下这些规则。表t的建表语句和初始化语句如下。
相关 MySQL进阶45讲【18】为什么只查一行的语句,也执行这么慢? MySQL进阶45讲【18】为什么只查一行的语句,也执行这么慢? 今天药忘吃喽~/ 2024年05月11日 09:27/ 0 赞/ 103 阅读
相关 MySQL进阶45讲【14】count(*)这么慢,该怎么办? MySQL进阶45讲【14】count(*)这么慢,该怎么办? 骑猪看日落/ 2024年05月07日 22:32/ 0 赞/ 104 阅读
相关 MySQL进阶45讲【38】insert语句的锁为什么这么多? MySQL进阶45讲【38】insert语句的锁为什么这么多? 爱被打了一巴掌/ 2024年05月07日 22:28/ 0 赞/ 100 阅读
相关 MySQL进阶45讲【20】为什么只改一行的语句,锁这么多? MySQL进阶45讲【20】为什么只改一行的语句,锁这么多? 阳光穿透心脏的1/2处/ 2024年05月07日 22:26/ 0 赞/ 107 阅读
相关 MySQL 为什么我只查一行的语句,也执行这么慢 一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下,“查一行”,也会执行得特别慢。今天,我就跟你聊聊这个有趣的话题,看看 - 日理万妓/ 2023年10月01日 23:50/ 0 赞/ 26 阅读
相关 【Mysql】改一行语句,锁这么多 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3czNzI0 野性酷女/ 2022年03月16日 15:45/ 0 赞/ 176 阅读
还没有评论,来说两句吧...