RDS MySQL行锁等待和行锁等待超时的处理

RDS MySQL行锁等待和行锁等待超时的处理

问题描述

当一个连接会话等待另外一个会话持有的互斥行锁时,就会发生行锁等待情况,行锁等待超时的报错如下。

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

 

问题原因

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

 

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

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

  1. 参考DMS登录RDS数据库,登录RDS数据库。
  2. 依次单击 性能 > InnoDB锁等待,检查导致锁等待和锁超时的会话。
    InnoDB锁等待
  3. 对于标识为Blocker的会话,即持有锁阻塞其他会话的DML操作,导致行锁等待和行锁等待超时,确认可以接受其对应的事务回滚的情况下,可以将其终止。

 

适用于

  • 云数据库 RDS MySQL 版

 

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。