意向锁的目的
意向锁(Intention Lock) 的主要目的是 提高锁冲突检测的效率,尤其是在表级锁和行级锁共存的情况下。它的作用可以类比为一种“预告”机制,告诉其他事务:“我打算对这个表中的某些行加锁,请你们注意!”
下面详细解释意向锁的目的和作用:
1. 意向锁的目的
1.1 提高锁冲突检测的效率
-
在数据库中,锁可以分为 表级锁 和 行级锁。
-
如果没有意向锁,当一个事务需要对表中的某些行加锁时,数据库需要逐行检查是否有锁冲突,这种检查方式效率很低。
-
意向锁通过在表级别上“预告”事务的加锁意图,使得数据库可以快速判断表级锁和行级锁之间的冲突,从而避免逐行检查。
1.2 支持表级锁和行级锁的共存
-
意向锁是一种表级锁,但它不会阻塞其他事务对表中其他行的操作。
-
它只是表明事务打算对表中的某些行加锁,而不是锁定整个表。
-
这种机制使得表级锁和行级锁可以高效共存。
2. 意向锁的作用
2.1 快速检测表级锁冲突
-
当一个事务需要对表加表级锁(如
LOCK TABLES ... WRITE
)时,数据库会检查是否有其他事务对表加了意向锁。-
如果其他事务已经对表加了意向锁(如 IS 或 IX 锁),则表级锁请求会被阻塞。
-
如果没有意向锁,则表级锁请求可以立即获得。
-
2.2 支持行级锁的粒度控制
-
意向锁允许事务在表级别上“预告”加锁意图,而不需要立即锁定具体行。
-
这种机制使得数据库可以更灵活地管理锁的粒度,从而提高并发性能。
3. 意向锁的类型
意向锁分为两种:
-
意向共享锁(IS锁):
-
表示事务打算对表中的某些行加 共享锁(S锁)。
-
例如:
SELECT ... LOCK IN SHARE MODE
。
-
-
意向排他锁(IX锁):
-
表示事务打算对表中的某些行加 排他锁(X锁)。
-
例如:
SELECT ... FOR UPDATE
、UPDATE
、DELETE
。
-
4. 意向锁的使用场景
4.1 行级锁操作
-
当执行
SELECT ... FOR UPDATE
或SELECT ... LOCK IN SHARE MODE
时,MySQL 会先对表加意向锁(IX 或 IS 锁),然后再对具体的行加锁。 -
例如:
sql
复制
SELECT * FROM t WHERE id = 1 FOR UPDATE;
-
MySQL 会先对表
t
加意向排他锁(IX锁),然后再对id = 1
的行加排他锁(X锁)。
-
4.2 表级锁操作
-
当执行
LOCK TABLES ... WRITE
或LOCK TABLES ... READ
时,MySQL 会检查是否有其他事务对表加了意向锁。-
如果有意向锁,则表级锁请求会被阻塞。
-
如果没有意向锁,则表级锁请求可以立即获得。
-
5. 意向锁的兼容性
意向锁之间是兼容的,但它们与表级锁之间存在冲突:
锁类型 | IS锁 | IX锁 | S锁(表级共享锁) | X锁(表级排他锁) |
---|---|---|---|---|
IS锁 | 兼容 | 兼容 | 兼容 | 不兼容 |
IX锁 | 兼容 | 兼容 | 不兼容 | 不兼容 |
S锁 | 兼容 | 不兼容 | 兼容 | 不兼容 |
X锁 | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
6. 总结
-
意向锁的目的是提高锁冲突检测的效率,支持表级锁和行级锁的共存。
-
它是一种表级锁,但不会阻塞其他事务对表中其他行的操作。
-
意向锁通过“预告”事务的加锁意图,使得数据库可以快速判断锁冲突,从而提升并发性能