ITPub博客

首页 > 数据库 > MySQL > 14.5.1 Innodb 的锁

14.5.1 Innodb 的锁

翻译 MySQL 作者:kakaxi9521 时间:2020-10-27 14:20:50 0 删除 编辑

14.5.1 Innodb Locking

此节会介绍Innodb中的锁的类型。

  • Shared and Exclusive 锁

  • Intention 锁

  • Record 锁

  • Gap 锁

  • Next-Key 锁

  • Insert Intention 锁

  • AUTO-INC 锁

  • Predicate Locks for Spatial Indexes


Shared and Exclusive 锁

Innodb 支持标准的行级锁,shared(S) 锁和exclusive(X) 锁。

  • shared(S) 锁允许事务在一行上持有共享锁进行读取操作。

  • exclusive(X) 锁允许事务在一行上持有排他锁进行update和delete操作。

如果事务T1在行r上持有shared(S)锁,事务T2在行r上的锁请求有下面两种情况:

  • 事务T2的S 锁请求会被立即赋予, T1和T2 在行r上都会持有S锁。

  • 事务T2的X 锁请求不会立即赋予。

如果事务T1 在行r上持有exclusive(X)锁,事务T2对行r的任何请求都不会被赋予,并且事务T2不得不等待事务T1 释放行r上的锁。

Intention 锁

Innodb 支持多个粒度锁定,允许行锁和表锁共存。 为了实现多个粒度级别的锁定,innodb使用意向所。 意向锁是表级锁,指示事务稍后对表中的行所需的锁定类型(shared 或 exclusive)。在Innodb 引擎中有两种意向锁(比如事务T 在表t上请求锁):

  • Intention shared(IS):   事务T试图在表t的行上持有S锁。

  • Intention exclusive(IX):  事务T试图设置X 锁。

例如: select ... lock in share mode 会设置IS锁, select ... for update 会设置IX锁。


意向锁遵循下面的规则:

  • 在事务想在表t上获取S 锁前,必须先获取IS锁或级别更高的锁。

  • 在事务想在行上获取X锁,必须现在表t上获取IX锁。

下面是锁的兼容矩阵:

事务在请求锁时如果与已经存在的锁兼容,锁立刻会被赋予,如果不兼容则需要等待,直到持有的锁释放。

意向锁不会阻塞全表扫描外的任何请求(比如:lock tables ... write). IX和IS 锁的主要目的是为了显示正在锁住一行,或准备锁住一行。

意向锁可以通过show engine innodb status\G; 命令去查看,比如:

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

Record Locks

记录锁会锁住索引记录。比如: select c1 from t where c1=10 for update; 此语句会阻塞其他事务对t.c1 =10 行的inserting,updating,deleting操作。

记录锁总会锁住索引记录,即使一张表没有索引。因为Innodb存储引擎会创建隐藏的聚集索引, 加锁的时候会用在此聚集索引上。

在show engine innodb status\G; 的输出中会有record 锁的输出:

Gap Locks

Gap 锁会锁住索引之间的间隙,或者锁住第一个索引之前或最后一个索引之后的记录。

比如:select c1 from t where c1 between 10 and 20 for update; 无论t.c1列是否有15这个值,都会阻塞其他的事务插入值15到列t.c1,因为10-20之间的值都被锁定了。

间隙可能是一个单独的索引,或者多个索引,也有可能是空值。

Gap 锁是performance 和 concurrency之间的平衡,会用在一些事务的隔离级别。

Gap 锁在寻找唯一行是不需要的。 比如:id 列有唯一索引,下面的sql只会在id 为100的行上加record 锁,不会影响到其他事务的插入操作。

select * from child where id = 100;

如果id 列没有索引或不是unique 索引,此sql就会锁住(-∞,10].

Gap 锁能够明确的关闭。 在事务的隔离级别设置为read committed 或 开始innodb_locks_unsafe_for_binlog 参数(此参数已被废弃)。

Next-Key 锁

next-key 锁是索引记录锁和间隙锁的组合。

在默认情况,Innodb 使用的是repeatable read 的事务隔离级别。 在这种情况下,Innodb 会使用next-key 锁在索引上进行查找和扫描,可以避免幻读。

Insert Intention 锁

AUTO-INC 锁

Predicate Locks for Spatial Indexes



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21374452/viewspace-2729835/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-13

  • 博文量
    136
  • 访问量
    179046