记录一下MySQL锁相关问题 Recordlock、间隙锁(Gap_lock),Next_Keylock
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
记录一下MySQL锁相关问题;下面说的都是针对行级锁相关问题。只做一些行级锁概念的区分;
提示:以下是本篇文章正文内容,下面案例可供参考
Recordlock、间隙锁(Gap_lock),Next_Keylock
Record Lock,记录锁,也就是仅仅把一条记录锁上;
Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;
Next-Key Lock:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身
间隙锁的x锁和s锁的式不做区分的;也就是说间隙锁之间是兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系,因为间隙锁的目的是防止插入幻影记录而提出的。
MySQL如何加锁
select要显式的写(写法如下)
//对读取的记录加共享锁(S型锁)
select … lock in share mode;
//对读取的记录加独占锁(X型锁)
select … for update;
update和delete默认是会加x锁,insert一般不加锁,但是会有隐式锁转为显示锁的情况(下面两种)
1.如果记录之间加有间隙锁,为了避免幻读,此时是不能插入记录的;
2.如果 Insert 的记录和已有记录存在唯一键冲突,此时也不能插入记录;
对于事务中行锁导致的死锁问题分析时需要注意的细节:
插入意向锁名字虽然有意向锁,但是它并不是意向锁(表锁),它是一种特殊的间隙锁,属于行级别锁。
如果说间隙锁锁住的是一个区间,那么「插入意向锁」锁住的就是一个点。因而从这个角度来说,插入意向锁确实是一种特殊的间隙锁。
一个事务不能同时拥有,区间冲突的间隙锁。插入意向锁属于间隙锁,
两个事务可以拥有同一区间的间隙锁;