Interblocage détecté / délai d'attente de verrou dépassé
Deux choses ont tenté d'enregistrer le même enregistrement au même moment et la base en a annulé une.
Faites d'abord ceci
De temps en temps, c'est normal. Si cela arrive constamment, un script enregistre beaucoup trop souvent.
Ce que ça veut dire
Deux transactions détiennent chacune une ligne que l'autre veut. MySQL en tue une pour que l'autre puisse finir : celle qui a été tuée est l'erreur que vous lisez. Un délai d'attente de verrou est le cousin plus doux : personne n'a interbloqué, une requête a simplement trop attendu un verrou et a abandonné.
Ni l'un ni l'autre n'est une corruption. La base a bien fait son travail ; c'est au code de gérer.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Deux sauvegardes pour le même joueur en même temps
Une sauvegarde automatique et une manuelle en concurrence sur la même ligne.
- 2
Des lignes verrouillées dans des ordres différents
Un chemin de code met à jour l'utilisateur puis le véhicule, un autre le véhicule puis l'utilisateur. C'est l'interblocage d'école.
- 3
Une longue transaction qui retient des verrous
Une transaction ouverte, quelque chose de lent fait dedans, puis validée.
- 4
Un UPDATE massif à l'heure de pointe
Une paie ou un wipe touchant chaque ligne pendant que les joueurs sont aussi sauvegardés.
- 5
Des index manquants qui élargissent le verrou
Sans index, un UPDATE verrouille bien plus de lignes que nécessaire.
Comment savoir laquelle est la vôtre
SHOW ENGINE INNODB STATUS;
La section LATEST DETECTED DEADLOCK nomme les deux transactions et les deux instructions, ce qui constitue en général tout le diagnostic.
Où regarder
Les deux instructions nommées par InnoDB, et si elles touchent les mêmes tables dans des ordres différents.
Comment la corriger
Verrouillez dans un ordre cohérent partout, gardez les transactions courtes, indexez ce que vous filtrez, et réessayez une fois en cas d'interblocage plutôt que d'abandonner l'opération :
CREATE INDEX idx_users_identifier ON users (identifier);
Un interblocage est une erreur réessayable par construction : la deuxième tentative réussit normalement parce que la transaction concurrente est terminée entre-temps.
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer repère les motifs de requête à l'origine de ceci.