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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL 与InnoDB 下的锁做朋友 (三)意向锁

前言



该篇谈谈 意向锁。


正文



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)锁定操作。


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


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


image.pngps:


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


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


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


好吧,这篇就到这吧。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
2天前
|
存储 算法 关系型数据库
介绍下InnoDB的锁机制?
InnoDB存储引擎的锁分为共享锁(S锁,读锁)和排他锁(X锁,写锁)。共享锁允许多个事务并发读取数据,不允许修改;排他锁允许读取和修改数据,阻止其他事务加锁。SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE分别用于获取共享锁和排他锁。此外,还有意向锁(IX,IS)用于协调行级锁和表级锁的并发问题,意向锁在事务请求锁时自动获取。记录锁锁定索引记录,插入记录锁用于插入操作前的间隙锁定,而AUTO-INC锁确保自增列的有序性。
|
4天前
|
存储 算法 关系型数据库
MySQL事务与锁,看这一篇就够了!
MySQL事务与锁,看这一篇就够了!
|
5天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
6天前
|
存储 SQL 关系型数据库
mysql中MyISAM和InnoDB的区别是什么
mysql中MyISAM和InnoDB的区别是什么
12 0
|
9天前
|
存储 关系型数据库 MySQL
MySQL的锁机制
MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制
25 4
|
11天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
160 4
|
14天前
|
存储 SQL 关系型数据库
|
16天前
|
存储 监控 关系型数据库
【MySQL】InnoDB 什么情况下会产生死锁
【MySQL】InnoDB 什么情况下会产生死锁
|
3天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
10 0

推荐镜像

更多