mysql之innodb的锁分类介绍
程序员文章站
2024-02-17 14:59:28
一、innodb行锁分类 record lock:记录锁,也就是仅仅锁着单独的一行 gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值...
一、innodb行锁分类
record lock:记录锁,也就是仅仅锁着单独的一行
gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值。
next-key lock:record lock+gap lock,所以next-key lock也就半开半闭区间,且是下界开,上界闭。 www.jb51.net
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在约束失败的情况下也设置这些锁定。
record lock:记录锁,也就是仅仅锁着单独的一行
gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值。
next-key lock:record lock+gap lock,所以next-key lock也就半开半闭区间,且是下界开,上界闭。 www.jb51.net
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在约束失败的情况下也设置这些锁定。
上一篇: map遍历的四种方法