问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MySQL中innodb的行锁算法

发布网友 发布时间:2023-03-12 16:38

我来回答

1个回答

热心网友 时间:2023-10-18 13:29

众所周知,innodb是默认行锁,当然也支持表锁。如下是对于行锁的算法进行的一些实验。

锁的算法为:我知道是行锁,但是是如何锁的,锁多少数据

假如有个索引是:[1,2,3,7]
record lock 锁的是 1,2,3,7
gap lock 锁的是 (- ,1),(2,3),(3,7),(7,+ )反正锁的就是区间,不是行
next-key lock锁的是 (- ,1],[2,3),[3,7),[ 7,+ )既锁范围也锁行

Innodb锁算法规则如下:

在可重复读隔离级别下,innodb默认使用的是next-key lock算法,当查询的索引是主键或者唯一索引的情况下,才会退化为record lock,在使用next-key lock算法时,不仅仅会锁住范围,还会给范围最后的一个键值加一个gap lock。

其中lockmode中的X锁为左边会话中的锁,因为需要显式的commit之后才会释放锁,第二个S锁,为右边的共享锁,因为主键ID为1的已经被锁住了,所以处于锁等待状态,锁的类型为record lock

使用辅助索引a=8进行操作,这个时候理论应该对主键索引加record lock 则 主键ID=8的被锁,然后辅助索引被加next-key lock 则为:
(7,8] 然后对下一个键值加gap锁,则为:(8,11)
所以目前被锁住的记录为:
1.主键为8的被锁
2.辅助索引8的被锁
3.辅助索引8到11之间的被锁,意味着你这个时候往8到11之间写数据会报错

当使用范围条件进行更新时,此时肯定是需要加X锁的,我是用的也是主键,所以按照理论应该是加的record lock ,但是却加了gap lock,因为插入值为10的阻塞了,查看information 也提示X.GAP
这个有点晕为啥主键变成了next-key lock ,不应该是record lock么?
update20200515
在知乎看到的一个解释:

即,在无论使用主键索引还是非主键索引的时候,请求共享锁或者排他锁,innodb会给范围内的记录加锁,而范围内的间隙也会被加锁,
例如一个表t 的 id为1,2,3,7,10
假如执行如下:
select * from t where id >=3 for update
那么这个时候执行
insert into t(id) values(8) 会被阻塞,因为是在请求排他锁时使用了范围,所以[3,10],甚至10以后的任何数据都无法插入。
执行
select * from t where id >=3 lock in share mode
insert into t(id) values(8) 会被阻塞,因为是在请求共享锁时使用了范围,所以[3,10],甚至10以后的任何数据都无法插入。

幻读是同一事务下,连续执行两次同样的sql可能导致不同的结果,第二次返回的数据可能导致以前不存在的行。
同时一般会问它和脏读的区别,脏读为读取到其他事务未提交的数据,但是幻读是读取的其他事务已经提交的数据。

reference:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
推荐一款在卧室听的音响,最好带CD,带收音机,可插U盘,价格1000以内!尽量... 求问,近几年还会有类似于声之形、你的名字这样的动漫电影么w_百度... 苦学包括什么 北京世纪百奥科技有限公司怎么样? 居住证积分需要哪些材料 上海办居住证积分需要什么资料 居住证积分有哪些材料 如何建立良好的家庭情感氛围 如何让家庭氛围更快乐 如何营造一个欢乐轻松的家庭氛围呢? 冬季为什么容易便秘 缓解便秘有什么方法 dnf可以继承的神器叫什么 堇青石有什么用? 新冠能喝满杯百香果吗 支气管肺炎吃百香果好不好 慢性肺炎可以吃百香果么 我用ibatis做insert操作的时候 我这张表的id是自动增长的,我想得到我刚刚插进去的数据的自动增长的id?? 冬季养生应该注意哪些问题? 求解,需要完整过程 python记录操作日志是否要用线程 调速器有什么作用? 调速器有什么作用 60岁老人腰椎间盘突出,怎么治疗 秋冬养生吃什么 吃三七粉有什么好处 食用三七粉注意事项 mysql导出某日期后的数据 奥德赛新车磨合高速怎么拉 心灵也要好好养,记住长寿养生之道四句精髓,老少均适用 想要身体健康长寿,牢记“三慢、三不”,此乃健康之方,长寿之道 健康长寿是我们所追寻的,我们应该如何做呢? SQL Server 2008 数据库镜像部署实例之一 数据库准备 如何部署SQL Server 2005 西方人把圣诞当作新年还是把元旦当作新年? 霉菌感染外耳道炎怎么治疗方法 请问一个月婴儿呕吐奶是什么原因? 如何查看oracle开销,或是sql的执行效率 皮鞋里面脏了怎么清洗能刷吗 洗皮鞋时候的注意事项 诸葛亮挥泪斩马谡是因为什么一事 马谡慌乱丢失街亭 女人得乳腺纤维瘤是怎么形成的 把花摘下来拍算花卉摄影吗? 防脱发的两大有效成分 防掉发的秘方 后脑勺脖子附近起了好多疙瘩痘痘,谁知道这是什么吗? 后脑勺长痘痘是什么原因后脑勺长痘痘4个原因 无毒专家大推!春天养生必吃这4种食物,排毒护肝又防癌 春季多吃绿色蔬菜 注意排毒很重要 鼻子上的黑头怎么才能去的掉,很烦恼。 有黑头,谁有去除的好方法 皮肤科医生是如何护肤 美国时尚杂志皮肤科医生,总结十条最佳护肤建议