在mysql的innoDB存储引擎中,如果更新操作是针对一个区间的,那么它会锁住这个区间内所有的记录,比如update xxx where id between a and b那么它会锁住a到b之间所有记录,注意是所有记录,甚至这个记录并不存在也会被锁住,这个时候,如果另外一个连接需要插入一条记录到a到b之间,那么它就必须等到上一个事务结束。
典型的例子就是使用auto_increment id,由于这个id是一直往上分配的,因此两个事务都insert时,会得到两个不同的,但是这两条记录还没有被提交,因此也就不存在,如果这个时候有一个事务进行范围操作,而且恰好要锁住不存在的,就是触发间隙锁问题。
结论,mysql中尽量不要使用区间更新。