1.使用一个普通非唯一索引进行删除会加间隙锁
2.共享间隙锁和排他间隙锁,是可以共存的,多个事务可以对同一个间隙进行加锁
3.多个事务拥有相同的间隙锁,再同时对该间隙插入数据,死锁发生
4.而对于不存在的记录,在RR级别下,delete加锁类型为gap lock
5.gap锁与gap锁之间不冲突,rec insert intention(插入意向锁)与gap锁冲突
解决:避免不必要的删除操作
delete 的加锁方式
1.在非唯一索引的情况下,删除一条存在的记录是有gap锁,锁住记录本身和记录两边的gap
2.在唯一索引和主键的情况下删除一条存在的记录,因为都是唯一值,进行删除的时候,是不会有gap存在
3.非唯一索引,唯一索引和主键在删除一条不存在的记录,均会在这个区间加gap锁
4.通过非唯一索引和唯一索引去删除一条标记为删除的记录的时候,都会请求该记录的行锁,同时锁住记录之前的gap
5.RC 情况下是没有gap锁的,除了遇到唯一键冲突的情况,如插入唯一键冲突。