> 文章列表 > 【MySQL】什么是意向锁 IS IX 及值得学习的思想

【MySQL】什么是意向锁 IS IX 及值得学习的思想

【MySQL】什么是意向锁 IS IX 及值得学习的思想

文章目录

    • 前言
    • 行锁和表锁
    • 使用意向
    • 意向锁的算法
    • 意向锁的思想
    • JDK 中相似的思想

前言

之前看 MySQL 都刻意忽略掉了 IS 和 IX 锁,今天看 《MySQL 是怎样运行的》,把意向锁讲的很通透,本篇博文提炼一下思想。

  • I: Intention Lock(意向锁)
  • S: Shared
  • X: Exclusive

行锁和表锁

InnoDB 提供事务能力,支持行锁。该引擎在并发读写数据时,让DDL语句安全执行,一般要4步:

  1. 确认表中是否有表锁
  2. 遍历每一行,确认表中是否有行锁
  3. 等待行锁全部释放
  4. 加表锁

使用意向锁

InnoDB 用意向锁取代普通表锁的用意是:

  • DDL语句执行前,避免遍历大量行数据才能确认加锁

EG: 10000 行的表,事务A在9500行加了个行锁。事务B执行DDL要加表锁,遍历9500次才确认该表有行锁,要阻塞等待。

意向锁的算法

想法非常简单,每次为表加行锁的时候,先加一个表级意向锁。

EG1: 10000 行的表,在9500行加了个行级 S 锁前,先加一个表级的 IS 锁。释放的时候同时释放
同理,加行级 X 锁前,先加一个表级 IX 锁。

引入意向锁后,让DDL语句安全执行,一般需要3步:

  1. 确认表是否有意向锁
  2. 等待意向锁释放
  3. 加表锁

意向锁的思想

  • 把 O(n) 的时间复杂度缩小到 O(1)
    【MySQL】什么是意向锁 IS IX 及值得学习的思想

JDK 中相似的思想

该链表的size方法不是实时计算的,而是每次添加元素都为一个遍历自增。与传统的数据结构O(n)遍历链表不同,这个信息量只需要 O(1) 的复杂度

java.util.ArrayList#size
【MySQL】什么是意向锁 IS IX 及值得学习的思想
【MySQL】什么是意向锁 IS IX 及值得学习的思想

中国互联网产业年会