MYSQL存储引擎InnoDB(四十四):InnoDB锁定(上)

共享锁和排它锁

InnoDB实现标准的行级锁定,其中有两种类型的锁, 共享(S)锁和排他(X)锁。

1、共享 ( S) 锁允许持有该锁的事务读取一行 。

2、排他 ( X) 锁允许持有该锁的事务更新或删除一行 。


如果T1事务在 r行上持有共享 ( S) 锁,则来自某个不同事务T2 的对 r行加锁的请求按如下方式处理:

1、T2请求的S锁可以立即授予 。结果,T1、T2两者都对r行保持S锁定状态。

2、T2请求的X锁不能立即授予 。


如果T1事务在 r行上持有排他 (X) 锁,则无法立即授予来自某个不同事务T2的对任一类型锁的加锁请求。相反,T2事务必须等待T1事务释放其对r行的锁定。


意向锁

InnoDB支持多粒度锁定,允许行锁和表锁共存。例如,诸如这样的语句LOCK TABLES ... WRITE在指定的表上获取了一个排他锁(一个X锁)。为了使多粒度级别的锁定变得实用,InnoDB使用 意向锁。意向锁是表级锁,它指示事务稍后对表中的行需要哪种类型的锁(共享或独占)。有两种类型的意图锁:

1、意向共享锁(IS)表示事务打算在表中的各个行上设置共享锁

2、意向排他锁 (IX)表示事务打算对表中的各个行设置排他锁。


例如,SELECT ... FOR SHARE设置一个IS锁, SELECT ... FOR UPDATE设置一个IX锁。

意向锁定协议如下:

1、在事务可以获取表中行的共享锁之前,它必须首先获取表上的IS锁或更强的锁。

2、在事务可以获取表中行的排他锁之前,它必须首先获取表上的IX 锁。


下面的矩阵总结了表级锁类型的兼容性。


X

IX

S

IS

X

冲突

冲突

冲突

冲突

IX

冲突

兼容的

冲突

兼容的

S

冲突

冲突

兼容的

兼容的

IS

冲突

兼容的

兼容的

兼容的


如果请求锁与现有锁兼容,则将锁授予请求事务,但如果与现有锁冲突则不会。事务会等待直到释放冲突的现有锁。如果请求锁与现有锁冲突并且由于会导致死锁 ,则会发生错误。

除了全表请求(例如LOCK TABLES ... WRITE)之外,意向锁不会阻塞任何东西。意向锁的主要目的是表明有人正在锁定一行,或者要锁定表中的一行。


记录锁

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

记录锁总是锁定索引记录,即使定义的表没有索引。对于这种情况, InnoDB创建一个隐藏的聚集索引并将该索引用于记录锁定。


间隙锁

间隙锁是在索引记录之间的间隙上的锁,或在第一条索引记录之前或最后一条索引记录之后的间隙上的锁。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;阻止其他事务将值15插入t.c1,无论该列中是否已经存在任何此类值,因为该范围内所有现有值之间的间隙都已锁定。

间隙可能跨越单个索引值、多个索引值,甚至是空的。

间隙锁是性能和并发性之间权衡的一部分,并且用于某些事务隔离级别而不是所有级别。

使用唯一索引锁定行以搜索唯一行的语句不需要间隙锁定。例如,如果id列具有唯一索引,则以下语句仅使用id值为 100的行的索引记录锁,其他会话是否在前面的间隙中插入行无关紧要:

SELECT * FROM child WHERE id = 100;


如果id没有索引或具有非唯一索引,则该语句会锁定前面的间隙。

这里还值得注意的是,不同的事务可以在间隙上持有冲突的锁。例如,事务 A 可以在一个间隙上持有一个共享间隙锁(gap S-lock),而事务 B 在同一个间隙上持有一个排他性间隙锁(gap X-lock)。允许冲突间隙锁的原因是,如果从索引中清除记录,则必须合并不同事务在记录上持有的间隙锁。

InnoDB间隙锁定是“纯粹的抑制性”,这意味着它们的唯一目的是防止其他事务插入到间隙中。间隙锁可以共存。一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。共享和排他间隙锁之间没有区别。它们彼此不冲突,并且执行相同的功能。

可以显式禁用间隙锁定。如果您将事务隔离级别更改为READ COMMITTED,则会发生这种情况 。在这种情况下,间隙锁定对搜索和索引扫描禁用,仅用于外键约束检查和重复键检查。

使用READ COMMITTED隔离级别还有其他效果 。在 MySQL 评估WHERE条件后释放不匹配行的记录锁。对于 UPDATE语句,InnoDB 执行“半一致”读取,以便将最新提交的版本返回给 MySQL。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章