DBAtlas · Atlas de operaciones de bases de datos

Analizar los deadlocks de InnoDB y registrarlos todos

MySQLRendimiento

Comando

-- Latest deadlock: LATEST DETECTED DEADLOCK section (only the most recent is kept)
SHOW ENGINE INNODB STATUS\G
-- Total deadlock counter
SELECT NAME, COUNT FROM information_schema.INNODB_METRICS WHERE NAME = 'lock_deadlocks';
-- Write every deadlock to the error log (logged at Note level, needs verbosity 3)
SET PERSIST innodb_print_all_deadlocks = ON;
SET PERSIST log_error_verbosity = 3;

Qué hace

Muestra las dos transacciones del deadlock, el bloqueo que cada una mantiene y espera (índice, lock_mode, registro) y cuál revirtió InnoDB; el contador mide la frecuencia y el error log conserva los deadlocks pasados.

Cuándo usarlo

Cuando la aplicación recibe el error 1213 'Deadlock found when trying to get lock' o aumentan las alertas de deadlock.

Precaución

LATEST DETECTED DEADLOCK solo conserva el último evento y se pierde al reiniciar. El nombre del índice y el lock_mode (X, S, gap, insert intention) en las líneas 'HOLDS THE LOCK(S)' / 'WAITING FOR THIS LOCK TO BE GRANTED' explican la causa; 'WE ROLL BACK TRANSACTION (n)' muestra la víctima. Ante un 1213 la aplicación debe reintentar la transacción completa. Soluciones permanentes: acceder a las filas en un orden consistente, mantener las transacciones cortas, usar el índice adecuado para reducir los gap locks y READ COMMITTED donde corresponda. log_error_verbosity=3 también habilita todos los mensajes Note; vigile el crecimiento del error log. La variable de estado Innodb_deadlocks no existe en MySQL Community; use INNODB_METRICS para el contador.

Abrir en DBAtlas →

Relacionado