场景:同事在处理下单流程的时候,突然发现请求接口没有反应,一直处于阻塞状态。
在检查具体的业务代码之后,发现并没有明显的错误。
思来想去,再次把目光投向了MySQL上面。第一步,先检查了一下是否有一直执行中的事务。
起初怀疑,嵌套事务的写法的saveapoint会不会对事务的执行造成影响,后面调整之后发现也还是一样。
悲观锁(没有)
更新语句也以主键作为更新条件,对当行库存数据修改时,锁的颗粒应该是行锁级别(个人见解,不对的话希望指导)
当下单接口请求时,更新库存的sql语句出现了lock_wait的状态。
SELECT * from information_schema.INNODB_TRX;
show processlist;
诡异的一点,在对应一直在running的事务,发现了trx_query是为空的,(经人指点之后,说这是事务没有提交也没有回滚时出现的状态)。在 kill 对应的trx_mysql_thread_id 之后,让测试并发的请求该接口,也没有出现事务卡死的情况。但是,==总会隔一段时间就出现==,真是烦人的小妖精。
但后面的我细心地发现,每次出现这个状况时,但是以整点为一个单位地出现,有时候是19:30:05 或者是15:00:03。