程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了「MySQL」InnoDB加锁情况大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

主要讨论RR隔离级别,因为RC只是少了间隙锁。

一、innodb七种锁

共享/排他锁(Shared and Exclusive Locks)

  1. 共享锁(Shared Locks,S锁)
  2. 排他锁(Exclusive Locks,X锁)

可以一起读,读写/写写互斥。

意向锁(Intention Locks)

  1. 意向共享锁(intention shared lock,IS)
  2. 意向排它锁(intention exclusive lock,IX)

看起来像表级锁,解决表级锁和行级锁的冲突。 意向锁之间兼容。 事务在请求S锁和X锁前,需要先获得对应的IS、IX锁。

S X
IS 兼容 互斥
IX 互斥 互斥

行锁

记录锁(Record Locks)

单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身。如果没有显示索引,innodb会创建隐式的聚集索引。

间隙锁(Gap Locks)

锁住一个索引区间(开区间)。 锁住索引记录的区间,或第一条索引记录之前的范围,或者最后一条索引记录之后的范围。

临键锁(Next-Key Locks)

记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间(左开右闭区间)。

插入意向锁(Insert Intention Locks)

一种特殊的间隙锁。 两个事务只要插入的行没有冲突,即使在同一间隙,也可以插入。

锁兼容矩阵

Gap Insert Intention Record Next-Key
Gap 兼容 兼容 兼容 兼容
Insert Intention 冲突 兼容 兼容 冲突
Record 兼容 兼容 冲突 冲突
Next-Key 兼容 兼容 冲突 冲突

存在Insert Intention 锁时,申请Gap锁是允许的;但是存在Gap锁时,申请Insert Intention锁时是被阻止的。

自增锁(AUTO-INC Locks)

表级锁,多个事务同时插入时,保证AUTO_INCREMENT列递增。

二、Sql加锁情况

普通SELEct

1.读未提交,读提交,可重复读 不加锁,快照读 2.串行化,普通SELEct会升级为 SELEct … in share mode

加锁SELEct

SELEct … for update SELEct … in share mode 1.唯一索引,唯一条件 记录锁(Record Locks) 2.其他的查询条件和索引条件 间隙锁(Gap Locks)与临键锁(Next-Key Locks)

update与delete

1.唯一索引,唯一条件 记录锁(Record Locks) 2.其他, 排他临键锁(Next-Key Locks)

insert

排它锁 、同时,会在插入区间加插入 意向锁(insert intention lock)

感谢: https://dev.mysql.com/doc/refman/5.5/en/innodb-locks-table.html https://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html#innodb-auto-inc-locks https://mp.weixin.qq.com/s/tmkRAmc1M_Y23ynduBeP3Q https://blog.csdn.net/zhanghongzheng3213/article/details/53436240 http://narcissusoyf.iteye.com/blog/1637309

大佬总结

以上是大佬教程为你收集整理的「MySQL」InnoDB加锁情况全部内容,希望文章能够帮你解决「MySQL」InnoDB加锁情况所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。