Mysql死锁:
通常是因为多个事务具有彼此不兼容的锁。
重复性RR或更高的级别将生成gap lock和next-key lock
兼容性矩阵(横向为已拥有的锁,纵向为请求的锁) )。
发生死锁的条件:
situation1:
AB都获得了GK,插入时都想获得IK,等待对方的GK被释放,发生了死锁。
situation2:
如何避免:
使用主键更新数据,以防止在使用非聚簇索引返回表和使用聚簇索引时发生争用导致的死锁。 如果认为不可能读取和重复幻像,请尽量使用RC隔离级别以避免gap lock死锁。 避免长事务,将事务分解设置为锁定超时并等待innodb_lock_wait_timeout