MySQL DELETE 删除语句加锁分析
http://www.fordba.com/lock-analyse-of-delete.html
1. 前言
在MySQL的使用过程中,对SQL加锁的类型经常感到疑惑,这让死锁分析也变得举步维艰。因此需要将MySQL的各种SQL在各个隔离级别下加的锁进行分析,以免再次分析的时候还感到疑惑,也方便用于查询。
本次分析对SQL的删除语句进行分析,主要从以下几种情况进行分析:非唯一索引删除一条存在的记录
唯一索引删除一条存在的记录
主键删除一条存在的记录
非唯一索引删除一条不存在记录
唯一索引删除一条不存在的记录
主键删除一条不存在的记录
不同的SQL根据主键删除2条记录
非唯一索引删除一条已经标记删除的记录
唯一索引删除一条已经标记删除的记录
在使用之前需要打开innodb lock monitor,这样在查看 engine innodb status 的时候可以更加清晰的查到到锁的情况
2. SQL的加锁分析
相关表结构普通索引表结构唯一索引表结构表的记录,唯一索引和普通索引的表结构均一样
测试的事务隔离级别为RR。
2.1 删除SQL加锁分析
根据非唯一索引删除一条存在记录
根据非唯一索引进行删除的时候,锁情况为:4 lock struct(s):4种锁结构,分别为IX,idx_c1和主键的行锁,还有idx_c1的gap锁
3 row lock(s):有3个行锁,除去IX的都是算在row lock里面
根据唯一索引删除一条存在记录
根据唯一索引