间隙锁键,是针对范围条件不存在的记录上的锁,避免不可重复读和幻象读。如果是读取提交的隔离级别,则不存在此问题。
所以,我们在开发中,如果使用可重复读的隔离级别,要尽量减少针对一定范围记录的更新,不然会严重影响并发插入。
特例:通过相等的条件,申请一个不存在的记录的锁,也会使用键锁,并影响记录的插入。
会话1:
root@sakila 10:49:04> select * from tab_no_index更新id=111;
空集(0.00秒)
会话2:,因为第一个会话加锁的记录不存在,所以对键加锁了,没有范围,等于所有,所以插入不了新的记录了
root@sakila 10:47:43>插入tab_no_index值(200 ' 200 ');
错误1205 (HY000):锁等待超时超过;试着重新启动事务
root@sakila 10:49:17>回滚;
查询好,0行影响(0.01秒)
所以,我们在开发中,如果使用可重复读的隔离级别,要尽量减少针对一定范围记录的更新,不然会严重影响并发插入。
特例:通过相等的条件,申请一个不存在的记录的锁,也会使用键锁,并影响记录的插入。
会话1:
root@sakila 10:49:04> select * from tab_no_index更新id=111;
空集(0.00秒)
会话2:,因为第一个会话加锁的记录不存在,所以对键加锁了,没有范围,等于所有,所以插入不了新的记录了
root@sakila 10:47:43>插入tab_no_index值(200 ' 200 ');
错误1205 (HY000):锁等待超时超过;试着重新启动事务
root@sakila 10:49:17>回滚;
查询好,0行影响(0.01秒)