当前位置:   article > 正文

mysql共享锁、排他锁、意向锁_排他锁和共享锁后别人能读吗

排他锁和共享锁后别人能读吗

1.共享锁(读锁)

加了读锁,只允许别的事务继续加读锁而不能加写锁,也就是只读。
用法是SELECT … LOCK IN SHARE MODE

2.排他锁(写锁)

加了写锁,别的事务不允许加任何锁。
用法师SELECT…FOR UPDATE

3.意向锁

意向锁在 InnoDB 中是表级锁,用来表达一个事务想要获取什么。
意向锁主要是针对整表的锁
意向锁间相互兼容,对行级锁不生效

先放意向锁的兼容图
意向锁兼容
单论意向锁,上面的图只看一半会更好理解,以此列举几种场景
在这里插入图片描述
1.不使用意向锁
A使用排他锁锁住了user表的id=5的这行数据,并未添加意向锁。
B使用排它锁锁user表,会先去判断每一行是否存在排他锁,效率非常的慢。

2.使用意向排他锁(IX)
A使用排他锁锁住了user表的id=5的这行数据,并对user表加了意向排他锁。
B使用排它/共享锁去锁user表,如果A表存在意向锁,则加锁失败。
即IX和X与S都冲突

3.使用意向共享锁(IS)
若A使用共享锁锁住了user表的id=5的这行数据,并对user表加了意向共享锁。
若B使用共享锁锁user表,而共享锁与意向共享锁是兼容的,所以B加锁成功。
若B使用排他锁锁user表,而排他锁与意向共享锁是冲突的,所以B加锁失败。
即IS与X冲突,与S兼容。

4.意向锁与意向锁兼容
A申请user表的意向共享锁,并锁住id=5这行数据
B申请user表的意向共享锁,并锁住id=6这行数据
B申请user表的意向排他锁,并锁住id=7这行数据
也就是因为意向锁之间相互兼容,所以意向锁对行级锁之间是不冲突的。

结论

当获取某一行锁的同时也会获取对应表的意向锁

1.意向排他锁和共享锁与排他锁冲突
(锁住一行的写锁,其他事务不可获取该表任何锁)
2.意向共享锁和共享锁兼容,和排他锁冲突
(锁住一行的读锁,另一事务可获取该表的读锁,不可获取该表的写锁)
3.意向锁之间相互兼容
(行锁之间不冲突)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/959825
推荐阅读
相关标签
  

闽ICP备14008679号