En primer lugar, los interbloqueos no dependen del bloqueo explícito. La TABLA DE BLOQUEO de MySQL o el uso de modos de aislamiento de transacciones no predeterminados NO están obligados a tener un interbloqueo. Todavía puede tener interbloqueos si nunca usa una transacción explícita.
Los interbloqueos pueden ocurrir en una sola mesa, con bastante facilidad. Por lo general, proviene de una sola mesa caliente.
Los interbloqueos pueden incluso sucede si todas sus transacciones solo hacen una inserción de una sola fila.
Puede ocurrir un punto muerto si tiene
- Más de una conexión a la base de datos (obviamente)
- Cualquier operación que involucre internamente más de un bloqueo.
Lo que no es obvio es que, la mayoría de las veces, una sola inserción o actualización de una fila implica más de un bloqueo. La razón de esto es que los índices secundarios también deben bloquearse durante las inserciones/actualizaciones.
Los SELECT no se bloquearán (suponiendo que esté usando el modo de aislamiento predeterminado y no esté usando FOR UPDATE), por lo que no pueden ser la causa.
SHOW ENGINE INNODB STATUS es tu amigo. Le dará un montón de información (ciertamente muy confusa) sobre interbloqueos, específicamente, el más reciente.
- No puede eliminar por completo los interbloqueos, seguirán ocurriendo en producción (incluso en los sistemas de prueba si los enfatiza adecuadamente)
- Apunta a una cantidad muy baja de interbloqueos. Si el 1 % de sus transacciones se estancan, posiblemente sean demasiadas.
- Considere cambiar el nivel de aislamiento de transacciones de sus transacciones a lectura confirmada SI ENTIENDE COMPLETAMENTE LAS IMPLICACIONES
- asegúrese de que su software maneje los interbloqueos adecuadamente.