V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  initObject  ›  全部回复第 2 页 / 共 2 页
回复总数  26
1  2  
2023-04-18 18:56:34 +08:00
回复了 gps32251070 创建的主题 程序员 求教 MySQL 加锁的一个疑问
2023-03-10 11:31:44 +08:00
回复了 jiangcheng97 创建的主题 程序员 关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
@UN2758
select * from t where c >=15 and c<=20 order by c desc for update;
加锁过程:
1.等值查询找第一个值 条件为等于 20 找到记录 20 加上 next-key 锁 ( 15,20]
2.向右找到第一个不满足条件的记录 25 加上 next-key 锁 然后退化为间隙锁 (20,25)
3.接着从第一步找的记录 20 开始向左范围查询(有待考证 有大神可以查查源码看下这一步是从第二步得到的记录 25 还是第一步得到的记录 20 开始) 条件为 c >=15 and c<=20 直到第一个不满足条件的记录 10 访问到的数据都加 next-key 锁 依次在 15 ,10 ,加上 next-key 锁
综上就是 (5,10] (10,15] (15,20] (20,25)

select * from t where c >=15 and c<=20 order by c asc for update;
加锁过程:
1.等值查询找到第一个条件为等于 15 找到记录 15 加上 next-key 锁 (10,15]
2.向右找到第一个不满足条件的记录 20 加上 next-key 锁 然后退化为间隙锁 (15,20)
3.接着从第一步找的记录 15 开始向右范围查询 条件为 c >=15 and c<=20 直到第一个不满足条件的记录 25 访问到的数据都加 next-key 锁 依次在 20 ,25 加上 next-key 锁
综上就是 (10,15] (15,20] (20,25]
2023-03-10 10:54:13 +08:00
回复了 jiangcheng97 创建的主题 程序员 关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
@UN2758 找第一个值用的是等值查询 接着范围查询 访问到第一个不满足的记录为止
普通索引等值查询 优化规则 2 向右找到第一个不符合条件的值 退化为间隙锁
降序查询 等值查询找第一个值为 20 接着向右找到第一个不符合条件(不等于 20 )的值 25 退化为间隙锁 ( 20,25 )接着范围查询(从 20 往左直到 10 )对于访问到的记录加上 next-key 锁
升序查询 等值查询找第一个值为 15 接着向右找到第一个不符合条件(不等于 15 )的值 20 但是 20 是符合条件<=20 的 所以不会退化为间隙锁( 15,20](也可以理解为先退化为间隙锁, 在之后的范围查询(从 15 往右直到 25 )中 加上了 next-key 锁)

等值查询之后就是范围查询 普通索引范围查询都加的是 next-key 锁 不会退化为间隙锁
2023-03-07 11:59:22 +08:00
回复了 jiangcheng97 创建的主题 程序员 关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
@UN2758 感谢纠正 非唯一索引范围查询 不会优化为间隙锁
2023-02-20 18:08:38 +08:00
回复了 jiangcheng97 创建的主题 程序员 关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
正常的 asc 排序中 用最小的值来找第一个
所以首先找到 c=15 的第一条记录
在 c=15 加上 next-key 锁 ( 10,15]
接着向右遍历 找到 c=20 的记录 满足条件 c<=20 在 c=20 加上 next-key 锁( 15,20]
因为是普通索引 引擎认为可能存在不止一条的 c=20 的记录 因此接着向右遍历 找到 c=25 的记录 第一个不满足条件 停止遍历 在 c=25 加上 next-key 锁( 20,25] 因为优化规则 优化为间隙锁 ( 20,25 )

加锁的顺序其实就是索引的遍历顺序 遍历到的记录或者区间都要加锁
2023-02-20 17:41:50 +08:00
回复了 jiangcheng97 创建的主题 程序员 关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
在索引遍历的过程上进行加锁
索引搜索指的是就是:
在索引树上利用树搜索快速定位找到第一个值
然后向左或向右遍历
order by desc 就是用最大的值来找第一个
order by asc 就是用最小的值来找第一个

因为 order by id desc 所以首先在普通索引找到 c=20 的第一条记录
在 c=20 加上 next-key 锁 (15,20]
因为是普通索引 引擎认为可能存在不止一条的 c=20 的记录 因此向右遍历找到第一条不符合条件的记录 c=25 加上间隙锁( 20,25 )
然后 开始在索引上向左遍历扫描 扫描过程中 记录 c=15 符合条件 加上 next-key 锁 (10,15]
可能存在不止一条 c=15 的记录 继续向左扫描 得到记录 c=10 (第一个不符合条件 c>=15 停止遍历) 加上 next-key 锁 ( 5,10]

因为没有使用覆盖索引 在 c=15,c=20 对应行记录加上 主键的 行锁
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2824 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 09:20 · PVG 17:20 · LAX 01:20 · JFK 04:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.