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

文章介绍了MySQL的InnoDB存储引擎如何使用意向锁提升并发性能,避免在执行DDL语句时遍历大量数据。意向锁分为IS和IX,用于在加行锁前先加表级的意向锁,减少确认锁状态的时间复杂度。文章还提到了JDK中ArrayList的size方法作为类似思想的例子,说明了通过预处理信息来提高效率的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前看 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)
    在这里插入图片描述

JDK 中相似的思想

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

java.util.ArrayList#size
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值