文章目录
- 前言
- 行锁和表锁
- 使用意向锁
- 意向锁的算法
- 意向锁的思想
- JDK 中相似的思想
前言
之前看 MySQL 都刻意忽略掉了 IS 和 IX 锁,今天看 《MySQL 是怎样运行的》,把意向锁讲的很通透,本篇博文提炼一下思想。
- I: Intention Lock(意向锁)
- S: Shared
- X: Exclusive
行锁和表锁
InnoDB 提供事务能力,支持行锁。该引擎在并发读写数据时,让DDL语句安全执行,一般要4步:
- 确认表中是否有表锁
- 遍历每一行,确认表中是否有行锁
- 等待行锁全部释放
- 加表锁
使用意向锁
InnoDB 用意向锁取代普通表锁的用意是:
- DDL语句执行前,避免遍历大量行数据才能确认加锁
EG: 10000 行的表,事务A在9500行加了个行锁。事务B执行DDL要加表锁,遍历9500次才确认该表有行锁,要阻塞等待。
意向锁的算法
想法非常简单,每次为表加行锁的时候,先加一个表级意向锁。
EG1: 10000 行的表,在9500行加了个行级 S 锁前,先加一个表级的 IS 锁。释放的时候同时释放
同理,加行级 X 锁前,先加一个表级 IX 锁。
引入意向锁后,让DDL语句安全执行,一般需要3步:
- 确认表是否有意向锁
- 等待意向锁释放
- 加表锁
意向锁的思想
- 把 O(n) 的时间复杂度缩小到 O(1)
JDK 中相似的思想
该链表的size方法不是实时计算的,而是每次添加元素都为一个遍历自增。与传统的数据结构O(n)遍历链表不同,这个信息量只需要 O(1) 的复杂度
java.util.ArrayList#size