当前位置:网站首页>不能再简单的意向锁
不能再简单的意向锁
2022-04-21 18:21:00 【江南一点雨】
InnoDB 存储引擎支持多粒度锁(multiple granularity locking),也就是允许行锁和表锁共存。当允许行锁和表锁共存的时候,可能会存在下面这样一个问题:
例如我执行如下 SQL:

这段 SQL 执行完成后,给 id 为 1 的记录加了排他锁。
此时,在另外一个会话中,我如果想给这张表再来一个表级共享锁,如下:
lock table user read;
此时就会有一个问题,共享锁和排他锁是互斥的,要给表上共享锁,就得去检查一下表中的每一条记录都不存在排他锁,如果表中的数据量比较大,这个操作效率就会比较低。
为了解决这个问题,就引出了我们今天的意向锁。为了使多粒度级别的锁定变得实用,InnoDB 使用了意向锁,注意,意向锁是一种表级锁,它表示事务稍后对表中的行需要哪种类型的锁(共享或独占)。
意向锁也分为两类:
- intention shared lock:意向共享锁 (IS) 表示事务打算在表中的各个行上设置共享锁。
- intention exclusive lock:意向排他锁 (IX) 表示事务打算对表中的各个行设置排他锁。
例如,对于 SELECT ... LOCK IN SHARE MODE; 会自动设置 IS 锁,对于 SELECT ... FOR UPDATE 会自动设置 IX 锁,并且 IS 锁和 IX 锁不需要手动设置,这个是由系统自动设置。
意向锁的加锁规则如下:
- 在事务可以获取表中行的共享锁之前,它必须首先获取表上的
IS锁或更强的锁。 - 在事务可以获取表中行的排他锁之前,它必须首先获取表上的
IX锁。
简而言之:IS 和 IX 是表锁,它们存在的意义在于,将来给表上表级的 S 锁或者 X 锁的时候,可以通过 IS 或者 IX 快速判断出当前表中是否已经有加锁记录了,仅此而已。所以 IS 和 IX 之间其实是兼容的,IX 之间也是兼容的,如下表:
| 兼容性 | IS | IX |
|---|---|---|
| IS | 兼容 | 兼容 |
| IX | 兼容 | 兼容 |
但是意向锁和表级锁则有可能冲突,如下:
| 兼容性 | IS | IX |
|---|---|---|
| X | 不兼容 | 不兼容 |
| S | 兼容 | 不兼容 |
上面这张表也好理解:
- 如果表上有 IS,说明表中的记录有共享锁,此时就不可以给表加排他锁(X 锁),但是可以给表加共享锁(S 锁)。
- 如果表上有 IX,说明表中的记录有排他锁,此时就不可以给表加排他锁(X 锁),也不可以给表加共享锁(S 锁)。
整体上来说,兼容关系如下表:
| 兼容性 | X | IX | S | IS |
|---|---|---|---|---|
| X | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
| IX | 不兼容 | 兼容 | 不兼容 | 兼容 |
| S | 不兼容 | 不兼容 | 兼容 | 兼容 |
| IS | 不兼容 | 兼容 | 兼容 | 兼容 |
由于意向锁并不需要我们手动添加,那么有没有办法让我们看到意向锁呢?可以的。
首先我们将系统变量 innodb_status_output_locks 设置为 ON,如下:

接下来我们执行如下 SQL,锁定一行数据,此时会自动为表加上 IX 锁:

接下来我们在一个新的会话中执行如下指令来查看 InnoDB 存储引擎的情况:
show engine innodb status\G
输出的信息很多,我们重点关注 TRANSACTIONS,如下:

可以看到:
TABLE LOCK table test08.user trx id 3564804 lock mode IX:这句就是说事务 id 为 3564804 的事务,为 user 表添加了意向排他锁(IX)。RECORD LOCKS space id 851 page no 3 n bits 80 index PRIMARY of table test08.user trx id 3564804 lock_mode X locks rec but not gap:这个就是一个锁结构的记录,这里的索引是 PRIMARY,加的锁也是正儿八经的记录锁(not gap),因为索引是 PRIMARY,所以这里没有间隙锁,关于间隙锁,咱们下篇文章继续。
好啦,希望今天这篇文章能让小伙伴们对意向锁有一个简单的认知。
参考资料:
版权声明
本文为[江南一点雨]所创,转载请带上原文链接,感谢
https://my.oschina.net/lenve/blog/5517382
边栏推荐
- 找出相等差值的卡片 (20 分) C语言
- 关于Linq语句
- Huawei level 18 Daniel collates and summarizes: microservice design and distributed service framework principle practice document
- WPF学习笔记——概述
- Just got the byte beat offer "floating"
- TCP/IP协议
- php如何去除首位数字
- Composant tooltip: déterminer si tooltip est affiché en fonction du débordement de contenu
- 单例模式你不得不知道的底层原理
- Goodbye SharedPreferences, hello mmkv!
猜你喜欢

C语言进阶第45式:函数参数的秘密(下)
Goodbye SharedPreferences, hello mmkv!

Target penetration exercise 73-dc5

别找了,这是迄今为止把微服务讲的最清楚的一篇!没有之一

华为18级大牛整理总结:微服务设计和分布式服务框架原理实践文档

移植openharmony之添加wifi驱动

laravel-soar(2.x) - 自动监控输出 SQL 优化建议、辅助 laravel 应用 SQL 优化

Mobile platform workplus integrated office, creating a full scene business ecosystem for enterprises

靶机渗透练习75-DC7

你已经用 SharedPrefrence 的 apply() 替换 commit() 了吗?
随机推荐
靶机渗透练习71-DC3
刚拿的字节跳动offer“打水漂”
Mobile platform workplus integrated office, creating a full scene business ecosystem for enterprises
靶机渗透练习75-DC7
How to use serialization and deserialization of JSON in golang
C语言进阶第45式:函数参数的秘密(下)
为拿几家大厂Offer,“闭关修炼
靶机渗透练习74-DC6
Advanced formula 45 of C language: the secret of function parameters (Part 2)
[intensive reading of Thesis] perception based seam cutting for image stitching
再见SharedPreferences,你好MMKV!
Tooltip component: judge whether to display tooltip according to whether the content overflows
WPF学习笔记——概述
Mongodb用户权限总结
MySQL 8.0 remote connection 2059 exception
Easy to use example
Observe cloud landing in Alibaba cloud computing nest and build a new ISV ecosystem
Target penetration exercise 71-dc3
Don't look for it. This is the clearest article on microservices so far! No one
靶机渗透练习73-DC5