Shared and Exclusive Locks(共享锁和排他锁)
- 共享锁(S)允许持有锁的事务读取一行
- 排他锁(X)允许持有锁的事务更新或者删除行
- 锁的特点
如果事务T1在行r持有共享锁,
事务T2如果获取行r的共享锁,可以立即获得(T1和T2同时持有行r的共享锁);
事务T2如果获取行r的排他锁,不能立即获得。
如果事务T1在行r持有排他锁,事务T2在行r获取任何锁都不能立即获得,必须等待T1释放锁。
Intention Locks(意向锁 )
- 意向共享锁(IS)表示事务打算对表中的各个行设置共享锁
- 意向排他锁(IX)表示事务打算对表中的各个行设置排他锁
- 锁的协议
在事务可以获取表中某行的共享锁之前,它必须首先获取该表中的IS锁或更强的锁
在事务可以获取表中某行的排它锁之前,它必须首先获取该表中的IX锁
Record Locks(记录锁)
- 记录锁定是对索引记录的锁定
SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;
- 记录锁始终锁定索引记录,即使没有定义索引的表也是如此。 对于这种情况,InnoDB创建一个隐藏的聚集索引,并将该索引用于记录锁定。
Gap Locks (间隙锁)
- 间隙锁定是对索引记录之间的间隙的锁定,或者是对第一个或最后一个索引记录之前的间隙的锁定
- 间隙可能跨越单个索引值,多个索引值,甚至为空
- 间隙锁定可以显式禁用。 如果将事务隔离级别更改为“已读”(READ COMMITTED)
Next-Key Locks(下一键锁)
- 下一键锁定是索引记录上的记录锁定和索引记录之前的间隙上的间隙锁定的组合。
Insert Intention Locks(插入意图锁)
- 插入意图锁是一种在行插入之前通过INSERT操作设置的间隙锁。
AUTO-INC Locks(自动上锁)
- AUTO-INC锁是一种特殊的表级锁,由事务插入具有AUTO_INCREMENT列的表中获得
Predicate Locks for Spatial Indexes(空间索引)
- InnoDB支持对包含空间列的列进行空间索引