Heim >Datenbank >MySQL-Tutorial >mysql之innodb的锁分类介绍_MySQL

mysql之innodb的锁分类介绍_MySQL

WBOY
WBOYOriginal
2016-06-01 13:23:17879Durchsuche

bitsCN.com 一、innodb行锁分类

record lock:记录锁,也就是仅仅锁着单独的一行
gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值。
next-key lock:record lock+gap lock,所以next-key lock也就半开半闭区间,且是下界开,上界闭。 www.bitsCN.com
next-key 锁定范围:(负无穷大,最小第一记录],(记录之间],(最大记录,正无穷大)

二、语句锁定情况分析

SELECT ... FROM ... FOR UPDATE对读遇到的所有索引记录设置独占的next-key锁定。
INSERT INTO ... VALUES (...)对被插入的行设置独占锁定。注意,这不是一个next-key锁定,并且不阻止其它用户在已插入行之前的间隙插入。如果发生重复键错误,对重复的索引记录设置共享锁定。
在一个表上初始化之前指定的AUTO_INCREMENT列之时,InnoDB在与AUTO_INCREMENT列相关联的索引的末尾设置独占锁定。在访问自动增长计数器中,InnoDB使用专用的表锁定模式AUTO-INC,其中锁定仅持续到当前SQL语句的结束,而不是到整个事务的结束。InnoDB取回先前初始化的AUTO_INCREMENT列的值而不设定任何锁定。

INSERT INTO T SELECT ... FROM S WHERE ... 对每个插入到T的行设置独占(非next-key)锁定。它在S上把搜索当作一个持续读,但是如果MySQL二进制日志功能被打开,它就对S设置一个共享的next-key锁
定。InnoDB在后一种情况不得不设置锁定:在从一个备份的前滚恢复中,每个SQL语句不得不以与它最初被执行的方式完全同样的方式执行。

CREATE TABLE ... SELECT ... 把SELECT当作一个持续读来执行,或者带着共享锁定来执行,如前面的条目所述。
如果唯一键没有冲突,REPLACE象一个插入一样被做。另外,对必须更新的行设置一个独占的nextkey锁定。
UPDATE ... WHERE ... 对搜索遇到的每个记录设置一个独占的next-key锁定。
DELETE FROM ... WHERE ... 对搜索遇到的每个记录设置一个独占的next-key锁定。
如果对一个表定义FOREIGN KEY约束,任何需要检查约束条件的插入,更新或删除对它看着检查约束的记录设置共享行级锁定。InnoDB在约束失败的情况下也设置这些锁定。
bitsCN.com

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn