ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL 与InnoDB 下的锁做朋友 (三)意向锁

2021-04-30 12:00:36  阅读:192  来源: 互联网

标签:行锁 兼容 InnoDB 意向锁 MySQL 共享 锁定 表级


前言

 

该篇谈谈 意向锁。

 

 

正文

 


InnoDB supports multiple granularity locking which permits coexistence of row locks and table locks.

For example, a statement such as LOCK TABLES ... WRITE takes an exclusive lock (an X lock) on the specified table.

To make locking at multiple granularity levels practical, InnoDB uses intention locks.

Intention locks are table-level locks that indicate which type of lock (shared or exclusive) a transaction requires later for a row in a table. 

翻译:

InnoDB支持多粒度锁,允许行锁和表锁共存。

例如,LOCK TABLES之类的语句。。。WRITE在指定的表上采用独占锁(X锁)。

为了实现多粒度级别的锁定,InnoDB使用了意向锁。

意向锁是表级锁,用于指示事务稍后对表中的行需要哪种类型的锁(共享或独占)。

 

 

看这些文字,感觉就是比较模糊, 那么我认为我应该写一点小白文,能让大家稍微理解一下。

 

1.意向锁是表级锁。
   但是 这个意向锁是个特殊的表级锁,由存储引擎去维护, 它不跟行锁冲突,意向锁直接也不冲突因为引擎级别的特殊表级概念

 

2.我们要清楚  正常的表锁和行锁是冲突的。

 

所以举个例子:

 

那么如果一个事务 A 对  用户表内数据 进行了 行锁排他锁操作;

事务B去获取这个用户表的写锁 排他锁时,第一步回去检测这个用户表是否上了表锁,如果没有,就会去检测这个用户表内数据有行锁锁定操作,导致 表&行锁冲突(如果存在冲突,就会进入等待行锁释放)。

问题就是在这, innodb 有行锁,有表锁,都支持。

如果说按照上面的例子,用户表 确实没有上 表锁锁定, 但是上了行锁锁定。

所以事务B为了检测里面是否真的有行锁锁定, 会对用户表做 行遍历,去找每一行是不是都没锁定操作,这样才能 获取表级写锁。

这样看上去效率就很低

 

所以设计者 搞出了意向锁。

当一个事务A 准备对 用户表进行 行级锁定操作,InooDB 会先获取该数据行所在的表的对应意向锁,进行意向锁锁定操作。

这样事务B过来尝试对 用户表做表锁锁定操作时,申请锁资源时,只需要看下 用户表是否存在 意向锁锁定 ,如果有,直接去等待资源就行,这样就不需要遍历了(以免遍了N久才知道有冲突,还是需要等待)。

 

 

理解了这个意向锁的作用后,我们再来回归意向锁的一些介绍。
 

意向锁 分两种:


意向共享锁 (IS)

意向排他锁(IX)

 


我们对某个表 做行锁操作时, 行锁也分 S锁和 X锁 (上一篇我们有说到)。

所以,innodb引擎 在知道我们对某个表数据准备使用 S (共享读锁,我上篇有讲过的)行级锁定时,就会去对这些行 所在的表,做  意向共享锁 (IS) 锁定操作。
同样,innodb引擎 在知道我们对某个表数据准备使用X (排他写锁,我上篇有讲过的)行级锁定时,就会去对这些行 所在的表,做 意向排他锁(IX)锁定操作。

 

最后放出一个小表格,结束我们的意向锁简单介绍篇(看久了都快不认识兼字了):
 

(简单总结就是,意向锁互相不冲突。 意向锁和表级锁之间的冲突,满足我上一篇所说的 共享读锁和排他写锁之间的冲突规则)

标题意向共享锁(IS)意向排他锁(IX)表级共享锁(S)表级排他锁(X)
意向共享锁(IS)兼容兼容兼容不兼容
意向排他锁(IX)兼容兼容不兼容不兼容
表级共享锁(S)兼容不兼容兼容不兼容
表级排他锁(x)不兼容不兼容不兼容不兼容

 

 

 

 

 

 


ps:

小明:教练,我想 上意向锁!

教练:搞不了,咱们自己是搞不了的!(存储引擎隐式操作意向锁)

 

大家简单了解完意向锁之后,有没有提炼出这个设计的精髓呢? 然后再细细想想,其他技术框架或者解决方案上是否也许也是有这种思想?

好吧,这篇就到这吧。
 

标签:行锁,兼容,InnoDB,意向锁,MySQL,共享,锁定,表级
来源: https://blog.csdn.net/qq_35387940/article/details/115734356

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有