执行MySQL出现Lock wait timeout exceeded异常


1.问题背景

  • 今天查看服务器异常日志发现有一段时间(18:10~18:13)出现频繁调用一个sql语句(delete from inspection_bill_ex where bill_code=? and process_type=? and business_type=? and property_name in 'haha')的情况,这段时间执行sql时出现多次Lock wait timeout exceeded;try restarting transaction异常,查询了一下问题,发现是因为delete语句扫描行数过多,导致sql执行时间长,又因为sql调用频繁,就产生了MySQL数据库事务锁等待问题。

2. 问题查询和解决

  1. 首先,查询了该sql在这个区间的执行次数和执行耗时,发现都有升高的趋势。
  • sql执行次数
    执行MySQL出现Lock wait timeout exceeded异常
  • sql执行耗时
    执行MySQL出现Lock wait timeout exceeded异常
  1. 接着,查询了sql语句的扫描行数,有150多万行数据,耗时很长。
    执行MySQL出现Lock wait timeout exceeded异常
  2. 之后,在数据库里查询“innodb的dml操作的行级锁的等待时间”,发现是5s,而当时的sql执行耗时有好多超过5s,最高达到7s多,因此会报错。

SHOW VARIABLES LIKE ‘innodb_lock_wait_timeout’ # 查看innodb_lock_wait_timeout的具体值

  1. 问题解决
    • 发现这个sql执行时间过长后,立即对条件字段加了联合索引( bill_code, process_type, business_type),这样保证该sql扫描的行数只有10行左右,因此执行时间很短。处理完成(18:20)之后,发现各指标都正常了。
      执行MySQL出现Lock wait timeout exceeded异常
      执行MySQL出现Lock wait timeout exceeded异常

3. 涨知识

  1. Lock wait timeout exceeded异常:指后提交的事务等待前面处理的事务释放锁,但是在等待的时候超过了mysql的锁等待时间,就会引发这个异常。
  2. innodb_lock_wait_timeout:指事务等待获取锁资源的等待最长时间,超过这个时间还未分配到资源则会返回应用失败。 当锁等待超过设置时间的时候,就会报如下的错误;ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。其参数的时间单位是秒,最小可设置为1s(一般不会设置得这么小),最大可设置1073741824秒,默认安装时这个值是50s(默认参数设置)。

参考文献

MySql Lock wait timeout exceeded该如何处理?
MySQL数据库事务锁等待:Lock wait timeout exceeded; try restarting transaction
mysql删除/更新数据时 报错 Lock wait timeout exceeded; try restarting transaction 锁超时
关于Lock wait timeout exceeded; try restarting trans