THE ORB
Arrancando el studio

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.

groupsAlgún guardado fallido de vez en cuandocodeNecesita un desarrollador

Haz esto primero

De vez en cuando es normal. Si pasa constantemente, un script está guardando muchísimo más de lo debido.

bug_reportMejor pega tu consola entera

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. 1

    Dos guardados para el mismo jugador a la vez

    Un guardado automático y uno manual compitiendo por la misma fila.

  2. 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. 3

    Una transacción larga reteniendo bloqueos

    Una transacción abierta, algo lento hecho adentro, y después confirmada.

  4. 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. 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 Fixer

Para este tipo de error, el Script Optimizer detecta los patrones de consulta que causan esto.

Errores que viajan con este