0. 定位和排查问题的常用语句
查询 正在执行的事务(这个输出有事物状态表明是否等待锁):
SELECT * FROM information_schema.INNODB_TRX查看正在锁的事务:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;这个语句显示当前所有的连接以及连接信息:show processlist查看最近一个sql查询产生的警告:show warnings;查看死锁日志:show engine innodb status G;
1. Gap 锁是单纯的防止其他事物在间隙中插入(修改),他们不妨碍其他事物在相同的间隙中加间隙锁(间隙X锁和S锁是一样的效果)。
举一个例子:
假设A事物在(3,6)上持有间隙锁,B事物使用update索引 4 的记录,但是索引4记录不存在,锁住了同样的(3,6)间隙锁,这是可以成功的。
继续,如果B事物update更新索引1记录的值为索引4,此时,索引记录1存在,锁住的是(1,3)间隙,但是起更改后的结果是影响到了A事物的加了锁的间隙(3,6),这是不能插入或更新。