mysql的锁
张三 2020-11-26 15:34:53 2020-11-26 73 0
InnoDB锁
本节介绍使用的锁类型 InnoDB
。
共享和独占锁
InnoDB
实现标准的行级锁定,其中有两种类型的锁, shared(S
)锁和exclusive(X
)锁。
如果事务在行上T1
持有一个shared(S
)锁r
,那么来自某个不同事务T2
的对行锁的请求r
将按如下方式处理:
- 由A请求
T2
用于S
锁可以立即被授予。其结果是,无论是T1
与T2
持有S
的锁r
。 - 通过请求
T2
一个X
锁不能立即授予。
如果事务在行上T1
持有exclusive(X
)锁r
,则不能立即授予来自某个不同事务T2
的锁定任何类型的锁的请求r
。相反,事务T2
必须等待事务T1
释放其对行的锁定r
。
意向锁
InnoDB
支持多粒度锁定,允许行锁和表锁共存。例如,诸如 在指定表上LOCK TABLES ... WRITE
进行独占锁定(X
锁定)之类的语句 。要在多个粒度级别实现锁定,请InnoDB
使用意向锁。意向锁是表级锁,它指示事务稍后对表中的行所需的锁(共享或独占)类型。意向锁有两种类型:
例如,SELECT ... FOR SHARE
设置IS
锁定并 SELECT ... FOR UPDATE
设置IX
锁定。
意向锁定协议如下:
- 在事务可以获取表中某行的共享锁之前,它必须首先在表上获取IS锁或更强。
- 在事务可以获取表中某行的独占锁之前,它必须首先获取表上的IX锁。
表级锁定类型兼容性总结在以下矩阵中。
X | IX | S | IS | |
---|---|---|---|---|
X | 冲突 | 冲突 | 冲突 | 冲突 |
IX | 冲突 | 兼容 | 冲突 | 兼容 |
S | 冲突 | 冲突 | 兼容 | 兼容 |
IS | 冲突 | 兼容 | 兼容 | 兼容 |
如果请求事务与现有锁兼容,则授予锁,但如果它与现有锁冲突则不会。事务等待,直到释放冲突的现有锁。如果锁定请求与现有锁冲突而无法授予,因为它会导致 死锁,则会发生错误。
意向锁定不会阻止除完整表请求之外的任何内容(例如,LOCK TABLES ... WRITE
)。意向锁定的主要目的是显示某人正在锁定行,或者要锁定表中的行。
意向锁定的事务数据SHOW ENGINE INNODB STATUS
与 InnoDB监视器 输出中的以下内容类似:
```sql
T