
MySQL在Repeatable READ(RR)情况下,insert出现唯一键(二级索引)冲突的时候会对主键加一个gap锁,在自增主键的情况下往往都会加在supermum上,也就是锁到(当前max,+无穷)。毫无疑问,当线上服务所有机器都等在这个supermum上的时候必然会产生等待。平时在唯一主键索引冲突很少的情况下并不凸显,但一旦出现较多唯一主键冲突叠加某台机器fullgc卡死的时候。所有insert都等待在那个疯狂fullgc导致迟迟无法commit的机器上,进而整个集群都会被拖垮而无法响应。
至于为什么唯一键(二级索引)冲突了需要锁主键其实是为了在RR下保证一致性。具体可以见这篇文章:
https://bugs.mysql.com/bug.php?id=116815