问题描述:
线上环境点击取消任务时, 系统后台报错, 检查日志错误为mysql发生死锁
问题排查:
mysql出现死锁的条件:(1) innoDB引擎, (2) 同时开启2个或2个以上的事务, 彼此持有对方的锁
线上环境分析:
事务A: 插入call_task_info表, call_task_info表上有更新task_info表任务数量的触发器
事务B: 更新task_info表的状态, 之后更新call_task_info表中相关的记录的任务状态
事务A与事务B影响的任务ID 相同
查看数据库死锁记录:
show engine innodb status;
查询记录如下:
------------------------
LATEST DETECTED DEADLOCK
------------------------
2020-11-19 18:50:15 7f06429f7700
*** (1) TRANSACTION:
TRANSACTION 674590067, ACTIVE 0.026 sec starting index read
mysql tables in use 2, locked 2
LOCK WAIT 4 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1
LOCK BLOCKING MySQL thread id: 1760585 block 1760584
MySQL thread id 1760584, OS thread handle 0x7f064c9e8700, query id 617886804 172.25.1.154 robot updating
UPDATE task_i