间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。
innodb_locks_unsafe_for_binlog,这个参数默认值是OFF, 也就是启用间隙锁, 他是一个bool值, 当值为true时表示disable间隙锁。
举个例子:
表testLock,有两个属性id,和name.有如下数据。
开启一个会话: session 1
sql> set autocommit=0; ##取消自动提交 sql> delete from testLock where id = ‘6’;
在开启一个会话: session 2
sql> set autocommit=0;##取消自动提交 sql> insert into testLock(id,name) values(‘6’,’hahaha’);
sql> delete from testLock where id = ‘6’; sql> insert into testLock(id,name) values(‘6’, ‘hahaha’);
这个时候最后一条语句:insert into testLock(id,name) values(‘6’, ‘hahaha’); 执行时就会爆出死锁错误。因为删除id = 6这条记录的时候,id为6之后的部分都被锁住了, 他们都取得了这一个数据段的共享锁, 所以在获取这个数据段的排它锁时出现死锁。
这种问题的解决办法:通过修改数据库的参数innodb_locaks_unsafe_for_binlog来取消间隙锁从而达到避免这种情况的死锁的方式尚待商量, 那就只有修改代码逻辑, 存在才删除,尽量不去删除不存在的记录。
来源:博客园
作者:kosamino
链接:https://www.cnblogs.com/jing99/p/11489510.html