mysql更新一条不存在的数据时给索引加锁的位置

场景,事务1更新一个id=5的数据,id=5不存在,事务2插入id=5的数据,事务2会不会被事务1阻塞,换句话说,事务1对不存在的id=5的数据行锁加的位置在哪里?

事务2被阻塞:

 

通过实验我们发现,如果当前表最大id小于5,那么如果更新id=5的不存在数据时,是在大于当前表行最大id的后面范围上加的锁,事务2插入id=5或者id>5的数据都会阻塞。

==================================================================

事务1更新不存在的id=5时,事务2无法插入id=5的数据:

如果id=5的数据是在表中id连续存在的情况下缺失的一行,比如说表中id分别是1,2,3,4,6,7,8,那么事务1加的锁是对id=5加的,虽然他不存在,而事务2这时如果去插入id=9的数据是没有影响的,

当然,如果事务2要去插入id=5的数据那肯定还是要被阻塞的;

 

=======================================================================

事务1更新不存在的id=5的数据时,如果当前表的id是1,2,3,4,7这种,那么事务2连id=6的数据都插入不了,说明事务1加锁是一个区间

如果id情况是1,2,3,4,7,8这种情况的话:如果事务1更新id=5,那么事务2想要插入id=5或者id=6的数据,都会被阻塞,所以可以任务,事务1是锁住了(4,7)这一段区间。

当然,如果事务2要插入id=9的数据,是没有问题的。

原文地址:https://www.cnblogs.com/nmcc33/p/15205683.html