Se encontró un interbloqueo / se agotó la espera por un bloqueo
Dos cosas intentaron guardar el mismo registro en el mismo momento y la base de datos canceló una.
Haz esto primero
De vez en cuando es normal. Si pasa constantemente, un script está guardando muchísimo más de lo debido.
Qué significa
Dos transacciones tienen cada una una fila que la otra quiere. MySQL mata una para que la otra pueda terminar: la que mató es el error que estás leyendo. Una espera agotada por un bloqueo es el primo suave: nadie se interbloqueó, una consulta esperó demasiado por un bloqueo y se rindió.
Ninguno de los dos es corrupción. La base de datos hizo lo correcto; el código tiene que saber manejarlo.
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
Dos guardados para el mismo jugador a la vez
Un guardado automático y uno manual compitiendo por la misma fila.
- 2
Filas bloqueadas en órdenes distintos
Un camino del código actualiza el usuario y después el vehículo, otro el vehículo y después el usuario. Ese es el interbloqueo de manual.
- 3
Una transacción larga reteniendo bloqueos
Una transacción abierta, algo lento hecho adentro, y después confirmada.
- 4
Un UPDATE masivo en hora pico
Un día de pago o un borrado tocando cada fila mientras además se guarda a los jugadores.
- 5
Índices que faltan y ensanchan el bloqueo
Sin un índice, un UPDATE bloquea muchas más filas de las que necesita.
Cómo saber cuál es el tuyo
SHOW ENGINE INNODB STATUS;
La sección LATEST DETECTED DEADLOCK nombra las dos transacciones y las dos sentencias, que suele ser el diagnóstico entero.
Dónde mirar
Las dos sentencias que nombra InnoDB, y si tocan las mismas tablas en órdenes distintos.
Cómo arreglarlo
Bloqueá en un orden consistente en todos lados, mantené las transacciones cortas, indexá lo que filtrás, y reintentá una vez ante un interbloqueo en vez de dar la operación por perdida:
CREATE INDEX idx_users_identifier ON users (identifier);
Un interbloqueo es un error reintentable por diseño: el segundo intento normalmente sale bien porque para entonces la transacción en conflicto ya terminó.
¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Script Optimizer detecta los patrones de consulta que causan esto.