MySQL InnoDB锁介绍及不同SQL语句分别加什么样的锁
当我们说到共享锁(S锁)或排它锁(X锁)时,一样平常是指行上的共享锁可能行上的排它锁。必要留意的是,表锁也存在共享锁和排它锁,即表上的S锁和表上的X锁,表上的锁除了这两种之外,还包罗下面将会提到的意向共享锁(Shard Intention Locks)即IS锁、意向排它锁(Exclusive Intention Locks)即IX锁。表上的锁,除了这四种之外,尚有其他范例的锁,这些锁都是在会见表的元信息时会用到的(create table/alter table/drop table等),本文不接头这些锁,具体可见:常用SQL语句的MDL加锁源码说明。 数据行r上共享锁(S锁)和排它锁(X锁)的兼容性如下: 假设T1持稀有据行r上的S锁,则当T2哀求r上的锁时:
假设T1持有r上的X锁,则当T2哀求r上的锁时: T2哀求r上的任何范例的锁时,T2都无法得到锁,此时,T2必必要守候直到T1开释r上的X锁 2、 意向锁(Intention Locks) 表锁。寄义是已经持有了表锁,稍候将获取该表上某个/些行的行锁。有shard或exclusive两种模式。 LOCK_MODE别离是:IS或IX。 意向锁用来锁定层级数据布局,获取子层级的锁之前,必需先获取到父层级的锁。可以这么看InnoB的层级布局:InnoDB全部数据是schema的荟萃,schema是表的荟萃,表是行的荟萃。意向锁就是获取子层级(数据行)的锁之前,必要起首获取到父层级(表)的锁。 意向锁的目标是奉告其他事宜,某事宜已经锁定了或即将锁定某个/些数据行。事宜在获取行锁之前,起主要获取到意向锁,即:
事宜哀求锁时,假如所哀求的锁 与 已存在的锁兼容,则该事宜 可以乐成得到 所哀求的锁;假如所哀求的锁 与 已存在的锁斗嘴,则该事宜 无法得到 所哀求的锁。 表级锁(table-level lock)的兼容性矩阵如下: 对付上面的兼容性矩阵,必然留意两点:
以是,意向锁只会阻塞 全表哀求(譬喻:LOCK TABLES ... WRITE),不会阻塞其他任何对象。由于LOCK TABLES ... WRITE必要配置X表锁,这会被意向锁IS或IX所阻塞。 InnoDB应承表锁和行锁共存,行使意向锁来支持多粒度锁(multiple granularity locking)。意向锁怎样支持多粒度锁呢,我们举譬喻下 T1: SELECT * FROM t1 WHERE i=1 FOR UPDATE; T2: LOCK TABLE t1 WRITE; T1执行时,必要获取i=1的行的X锁,但,T1获取行锁前,T1必需先要获取t1表的IX锁,不存在斗嘴,于是T1乐成得到了t1表的IX锁,然后,又乐成得到了i=1的行的X锁;T2执行时,必要获取t1表的X锁,但,T2发明,t1表上已经被配置了IX锁,因此,T2被阻塞(由于表的X锁和表的IX锁不兼容)。 假设不存在意向锁,则: T1执行时,必要获取i=1的行的X锁(不必要获取t1表的意向锁了);T2执行时,必要获取t1表的X锁,T2可否获取到T1表的X锁呢?T2无法当即知道,T2不得不遍历表t1的每一个数据腥傩已查,是否某个行上已存在的锁和本身即将配置的t1表的X锁斗嘴,这种的判定要领服从其实不高,由于必要遍历整个表。 以是,行使意向锁,实现了“表锁是否斗嘴”的快速判定。意向锁就是和谐行锁和表锁之间的相关的,可能也可以说,意向锁是和谐表上面的读写锁和行上面的读写锁(也就是差异粒度的锁)之间的相关的。 3、 索引记录锁(Record Locks) 也就是所谓的行锁,锁定的是索引记录。行锁就是索引记录锁,所谓的“锁定某个行”或“在某个行上配置锁”,着实就是在某个索引的特定索引记录(或称索引条目、索引项、索引进口)上配置锁。有shard或exclusive两种模式。 LOCK_MODE别离是:S,REC_NOT_GAP或X,REC_NOT_GAP。 行锁就是索引记录锁,索引记录锁老是锁定索引记录,纵然表上并未界说索引。表未界说索引时,InnoDB自动建设潜匿的聚积索引(索引名字是GEN_CLUST_INDEX),行使该索引执行record lock。 4、 间隙锁(Gap Locks) 索引记录之间的间隙上的锁,锁定尚未存在的记录,即索引记录之间的间隙。有shard或exclusive两种模式,但,两种模式没有任何区别,二者等价。 LOCK_MODE别离是:S,GAP或X,GAP。 gap lock可以共存(co-exist)。事宜T1持有某个间隙上的gap lock 并不能阻止 事宜T2同时持有 统一个间隙上的gap lock。shared gap lock和exclusive gap lock并没有任何的差异,它俩并不斗嘴,它俩执行同样的成果。 gap lock锁住的间隙可所以第一个索引记录前面的间隙,或相邻两条索引记录之间的间隙,或最后一个索引记录后头的间隙。 索引是B+树组织的,因此索引是从小到大按序分列的,在索引记录上查找给定记录时,InnoDB会在第一个不满意查询前提的记录上加gap lock,防备新的满意前提的记录插入。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |