Descripción del problema
Se produce una espera de bloqueo de fila cuando una sesión aguarda un bloqueo exclusivo de fila que retiene otra sesión. Un tiempo de espera de bloqueo agotado devuelve el siguiente error:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Causas
Por lo general, la sesión que retiene el bloqueo exclusivo de fila completa sus operaciones rápidamente y libera el bloqueo mediante una confirmación o reversión de transacción. La sesión en espera adquiere entonces el bloqueo antes de que se agote el tiempo de espera y continúa con su operación. Sin embargo, en algunos casos, una sesión puede retener un bloqueo exclusivo de fila durante mucho tiempo. Esto sucede si la sesión de base de datos de una aplicación cliente se interrumpe sin que la instancia lo detecte. Si otras sesiones solicitan después el mismo bloqueo, se producirán múltiples esperas y tiempos de espera de bloqueo.
Soluciones
Los métodos descritos en este tema solo aplican cuando hay una espera de bloqueo de fila activa. El tiempo de espera de bloqueo predeterminado en RDS for MySQL es de 50 segundos, lo que dificulta observar una espera de bloqueo en curso. Para reproducir el problema, configure el parámetro innodb_lock_wait_timeout con un valor alto. No obstante, no utilice valores elevados para innodb_lock_wait_timeout en un entorno de producción.
Inicie sesión en una instancia de RDS for MySQL mediante DMS.
-
Consulte las transacciones actuales y aquellas que esperan bloqueos.
-
Ejecute la siguiente sentencia SQL para consultar las transacciones en ejecución:
SELECT * FROM information_schema.INNODB_TRX; -
Ejecute la siguiente sentencia SQL para consultar las transacciones que esperan bloqueos:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; -
Ejecute la siguiente sentencia SQL para consultar los bloqueos retenidos por las transacciones:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-
Una sesión identificada como bloqueante retiene un bloqueo que impide las operaciones de lenguaje de manipulación de datos (DML) de otras sesiones, lo que provoca esperas y tiempos de espera de bloqueos de fila. Si confirma que es aceptable revertir la transacción de la sesión bloqueante, finalice dicha sesión.
Si el problema persiste, consulte Bloqueo de bloqueos para aprender a usar la página de estadísticas de bloqueo de bloqueos. Esta herramienta le permite localizar rápidamente la sesión que causa el bloqueo prolongado y consultar sus detalles.
Aplicable a
ApsaraDB RDS for MySQL