西安seo代理商日喀则网站seo
文章目录
- 前言
 - 行锁和表锁
 - 使用意向锁
 - 意向锁的算法
 - 意向锁的思想
 - 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
 
 
