问题描述

当一个连接会话等待另外一个会话持有的互斥行锁时,就会发生行锁等待情况,行锁等待超时的报错如下。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

问题原因

通常情况下,持有该互斥行锁的会话会迅速的执行完相关操作并释放掉持有的互斥锁(事务提交或者回滚),然后等待的会话在行锁等待超时时间内获得该互斥行锁,进行下一步操作。但在某些情况下,比如一个实例未感知到的来自客户端应用的数据库会话中断,持有该互斥行锁的会话长时间不释放该互斥行锁,此时如果有其他会话申请该互斥行锁,则会导致大量的行锁等待与行锁等待超时。

解决方案

本文提供的检查和处理方法,仅当正在发生行锁等待的情况下才成立。因为RDS MySQL行锁等待默认超时时间为50秒,通常情况下不容易观察到行锁等待的现场,可以通过将innodb_lock_wait_timeout参数设置为较大值来复现问题,但是生产环境不推荐使用过大的innodb_lock_wait_timeout参数值。

  1. 通过DMS登录RDS数据库
  2. 请您执行以下操作,查看存在当前正在执行的事务和等待锁的事务。
    • 执行以下SQL语句,查看正在执行的事务。
      SELECT * FROM information_schema.INNODB_TRX;
    • 执行以下SQL语句,查看等待锁的事务。
      SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
    • 执行以下SQL语句,查看正在锁的事务。
      SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
  3. 对于标识为Blocker的会话,即持有锁阻塞其他会话的DML操作,导致行锁等待和行锁等待超时,确认可以接受其对应的事务回滚的情况下,可以将其终止。
  4. 如果您还是无法解决问题,请参见锁阻塞,通过锁阻塞统计页面快速定位造成长时间阻塞的会话及其详细信息。

适用于

云数据库RDS MySQL版