根据公司SRE给出的慢查询记录:
我在Kibana中查到了相关的600多条日志:
根本原因在于某sql update,where id in的列表过长(多达几百),range过大的互斥锁不好申请(估计读已提交级别,update … where id in (…)采用的是间隙锁,查过一些资料,未能100%确认)。它所在的事务一直申请不到锁,就超时(默认50秒)报错了:
com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
。而在宏观上,业务上又需要在一段时间内大量访问这段代码,就会反复产生大事务,加剧了锁的竞争,从而造成了慢查询。
一句话概括,大事务高并发。
解决思路
拆分大事务