最近项目中发生死锁问题,发现是mysql为保证可重读而使用间隙锁导致的。
场景是在在一个事务里面查询了多条记录(包括记录A),而mysql数据库的隔离机制是可重复读,为了保证在这个事务里这些数据不被其他连接修改。就会吧这些数据加上间隙锁(范围锁)。这时其他线程在另一个事务里查询了数据B,(相当于给数据B加间隙锁),然后想要修改数据A,照成两个事务互相等待对方释放锁,就照成了死锁。
流程图如下:
最近项目中发生死锁问题,发现是mysql为保证可重读而使用间隙锁导致的。
场景是在在一个事务里面查询了多条记录(包括记录A),而mysql数据库的隔离机制是可重复读,为了保证在这个事务里这些数据不被其他连接修改。就会吧这些数据加上间隙锁(范围锁)。这时其他线程在另一个事务里查询了数据B,(相当于给数据B加间隙锁),然后想要修改数据A,照成两个事务互相等待对方释放锁,就照成了死锁。
流程图如下: