1. Shared and Excl本文来源gaodai^.ma#com搞#代!码网
usive Locks
shared lock (译:共享锁)
exclusive lock (译:排它锁、独占锁)
InnoDB实现了标准的行级锁,其中有两种类型的锁,共享锁(shared locks)和排他锁(exclusive locks)。
A shared (S) lock permits the transaction that holds the lock to read a row.
An exclusive (X) lock permits the transaction that holds the lock to update or delete a row.
共享锁允许持有该锁的事务读取一行。
排它锁允许持有该锁的事务更新或删除行。
如果事务T1持有行 r 上的共享锁(S),那么来自不同事务T2的请求将按照以下方式处理:
- T2对S锁的请求可以立即被授予。结果就是,T1和T2在行r上都持有S锁。
- T2对X锁的请求不能立即被授予。
如果事务T1持有行 r 上的排它锁(X),那么来自不同事务T2的请求不能立即被授予 r 上任何一种类型的锁。相反,事务T2必须等待事务T1释放其在行 r 上的锁。
2. Intention Locks
Intention Locks(译:意向锁)
InnoDB支持多粒度锁,允许行锁和表锁共存。 例如,诸如LOCK TABLES … WRITE之类的语句对指定表采用排它锁(X锁)。为了在多个粒度级别上实现锁,InnoDB使用了意向锁。意向锁是表级锁,它指示事务稍后需要对表中的一行使用哪种类型的锁(共享锁或者排它锁)。
有两种类型的意向锁:
- 意向共享锁(IS)表示事务打算在表中的单个行上设置共享锁。
- 意向排他锁(IX)表示事务打算在表中的单个行上设置排它锁。
例如,SELECT … LOCK IN SHARE MODE 设置一个IS锁,SELECT … FOR UPDATE 设置一个IX锁。
意向锁的协定是这样的:
在事务获得表中某一行的共享锁之前,它必须首先获得表上的IS锁或更强锁。
在事务获得表中某一行的排它锁之前,它必须首先获得表上的IX锁。
表级锁类型兼容性如下图:
如果一个锁与现有锁兼容,则将其授予请求的事务,但如果与现有锁冲突,则不授予该锁。事务等待,直到冲突的现有锁被释放。如果一个锁请求与一个现有的锁冲突,并且因为它会导致死锁而不能被授予,那么就会发生错误。
意向锁除了全表请求(例如LOCK TABLES … WRITE)外,不阻止任何其他内容。意图锁定的主要目的是表明某人正在锁定表中的行或要锁定表中的行。
3. Record Locks
Record Locks(译:记录锁)
A record lock is a lock on an index record.
记录锁是索引记录上的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 防止任何其他事务插入、更新或删除t.c1值为10的行。
记录锁总是锁定索引记录,即使一个表没有定义索引也是如此。如果表没有索引,InnoDB创建一个隐藏的聚集索引,并将该索引用于记录锁。
4. Gap Locks
Gap Locks(译:间隙锁)
A gap lock is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.
间隙锁是在索引记录之间的间隙上的锁,或者是在第一个索引记录之前或最后一个索引记录之后的间隙上的锁。
例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; 防止其他事务将值15插入到t.c1列中,无论该列中是否已经有这样的值,因为范围内所有现有值之间的间隙都被锁定了。