InnoDB锁

Lock Types Used By InnoDB.

  • Shared and Exclusive Locks 共享锁和排他锁
  • Intention Locks 意向锁
  • Record Locks
  • Gap Locks
  • Next-Key Locks
  • Insert Intention Locks
  • AUTO-INC Locks
  • Predicate Locks for Spatial Indexes
  • 参考资料

Shared and Exclusive Locks 共享锁和排他锁

InnoDB实现了两类标准的行级锁,分别为shared (S) 锁和 exclusive (X)锁;
shared (S) 锁:获取到该行共享锁的事务可以读取该行.
exclusive (X)锁:获取到该行排它锁的事务可以更新或删除该行.

如果事务T1在r行上获取了一个共享锁,那么事务T2请求获取r行的锁的处理情况如下:

  • 如果T2请求的是一个共享锁,那么立刻给予。

  • 如果T2请求的是一个排它锁,那么不能立刻给予;

如果事务T2在r行上持有一个排它锁,那么事务T2无论请求什么锁都不能被立即给予。T2必须等待T1释放T1所持有的排它锁。

Intention Locks 意向锁

InnoDB支持行级锁表级锁共存的多粒度(multiple granularity locking)的锁机制。如LOCK TABLES … WRITE这样的语句会在相应的表添加表级排他锁。InnoDB使用意向锁保证多粒度的锁机制切实可行。意向锁是表级锁,用于表示事务稍后会在表中某行使用哪种类型的锁(共享或独占)。有两种意向锁:

  • 意向共享锁表示一个事务将在表中的某些行加共享锁。例:SELECT … FOR SHARE 设置意向共享锁。

  • 意向排它锁表示一个事务将在表中的某些行加排它锁。例:SELECT … FOR UPDATE 设置意向排它锁。

意向锁协议如下:

  • 事务在获得表中某些行的行级共享锁之前,必须获得该表的意向共享锁或者更强的锁。
  • 事务在获得表中某些行的行级排它锁之前,必须获得该表的意向排它锁。

意向锁是有数据引擎自己维护的,用户无法手动操作意向锁

表级别锁的兼容性在下列举证中总结

X IX S IS
X 冲突 冲突 冲突 冲突
IX 冲突 兼容 冲突 兼容
S 冲突 冲突 兼容 兼容
IS 冲突 兼容 兼容 兼容

注意:上述的锁都是表级别,如当事务T1获得了一个表级的IS锁,那么事务T2尝试获得表级X锁则不会被给予。

A lock is granted to a requesting transaction if it is compatible with existing locks, but not if it conflicts with existing locks. A transaction waits until the conflicting existing lock is released. If a lock request conflicts with an existing lock and cannot be granted because it would cause deadlock, an error occurs.

意向锁除了阻止全表锁请求外,其不会阻止任何锁请求。意向锁的主要目的就是表明某个事务正锁着表中某一行或者将要锁住表中某一行;从上述描述我们可以知道,意向锁是不会和任何行级锁冲突的;

如果还是没理解意向锁的意义,那么我们这么来解释,假设T1事务获取了表中某些行的行级排它锁,事务T2想获得表的表级共享锁,如果没有意向锁,那么需要去检测每一行是否被锁住,如果有了意向锁,那么就只需要判断意向锁是否能够获取,就无需检测每一行了。

Transaction data for an intention lock appears similar to the following in SHOW ENGINE INNODB STATUS and InnoDB monitor output:

TABLE LOCK table test.t trx id 10080 lock mode IX

Record Locks

记录锁是在索引记录上的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;阻止任何其他事务进行插入,更新,或者删除

记录锁总是对索引记录加锁,即使表没有定义索引。对于表没有定义锁的这种情况,InnoDB构建一个隐藏的聚族索引用于记录锁,See Section 15.6.2.1, “Clustered and Secondary Indexes”.

Transaction data for a record lock appears similar to the following in SHOW ENGINE INNODB STATUS and InnoDB monitor output:

RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `test`.`t`
trx id 10078 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 8000000a; asc     ;;
 1: len 6; hex 00000000274f; asc     'O;;
 2: len 7; hex b60000019d0110; asc        ;;

Gap Locks

Next-Key Locks

Insert Intention Locks

AUTO-INC Locks

Predicate Locks for Spatial Indexes

参考资料

InnoDB中的意向锁,不与行级锁冲突的表级锁

你可能感兴趣的:(数据库,java,开发语言)