select..lock in share mode / Serializable下的select 会加S锁 select..for update / 写操作(insert update delete) 会加X锁 上述的锁都是行级别的,S锁和X锁同样可以加在表级别上,对应的语句分别是LOCK TABLE … READ和LOCK TABLE … WRITE 意向锁(IS锁/IX锁) (Intention Locks) 意向锁是表级别的锁,用...
Next-Key Locks = Gap+record => 间隙锁+行锁,执行delete/update操作时会加Next-Key Locks ,如果where条件是可以唯一确定一行的话,会被升级为普通行锁不会加区间锁。 1、delete/update操作无索引列=>表锁 2、delete/update操作有索引列=>主键或者唯一索引=>行锁 3、delete/update操作有索引列=>普通索引=>区...
在进行增删改查的时候会加 MDL 读锁; 在对表结构进行变更的时候,会加 MDL 写锁; 这个会带来的问题就是当我们想给表添加索引或者修改表结构的时候,由于加了 MDL 写锁,会阻塞我们线上正常的读写请求,这个时候可能会触发上游的失败重试机制,那很可能就会出现请求雪崩导致 DB 被打挂。 另外的就是与我们日常业务...
2023.10.4 更新:当事务A回滚时,释放锁,此时事务B并不会获取next-key,而是获得两个gap锁,具体分...
那就是next-key一般是指临键锁而非间隙锁,临键锁本身就相当于记录锁+间隙锁。因此题主所说的“...
更新操作(update)和插入(insert)操作会自动加锁 加锁规则: 1、加锁基本单位是next-key lock,即前开后闭区间 2、查找过程中访问到的对象才会加锁 3、索引上的等值查询,给唯一索引加锁时,next-key lock退化为行锁 4、索引上的等值查询,向右遍历时且最右一个值不满足等值条件的时候,next-key lock退化为间隙锁...
临界<= 查询时,8.0.17 会锁住下一个 next-key 的前开后闭区间,而 8.0.18 及以后版本,修复了这个 bug。 3非主键唯一索引 非主键唯一索引等值查询,数据存在,for update 是会在主键加锁的,而 for share 只有在走覆盖索引的情况下,会仅在自己索引上加锁; ...
主键等值查询,数据不存在时,会对查询条件主键值所在的间隙添加间隙锁X,GAP; 主键等值查询,范围查询时情况则比较复杂: 8.0.17 版本是前开后闭,而 8.0.18 版本及以后,修改为了前开后开区间; 临界<=查询时,8.0.17 会锁住下一个 next-key 的前开后闭区间,而 8.0.18 及以后版本,修复了这个 bug。
什么SQL 语句会加行级锁? InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁,所以后面的内容都是基于 InnoDB 引擎 的。 普通的 select 语句是不会对记录加锁的,因为它属于快照读,是通过 MVCC(多版本并发控制)实现的。 如果要在查询时对记录加行级锁,可以使用下面这两个方式,这两种查询会加锁的语句...