Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Deadlock avec un insert qui déclenche un déclencheur

Le thread 2 détient un verrou partagé sur la ligne de la table des utilisateurs.

Ensuite, le thread 1 essaie d'obtenir un verrou exclusif sur la même ligne et passe en attente de verrouillage.

Mais le thread 1 n'aura pas l'occasion d'expirer, car le thread 2 essaie alors d'élever son verrou en exclusif... mais pour ce faire, il doit attendre le thread 1, qui est en attente de verrouillage, mais il attend fil 2.

Ils se bloquent l'un l'autre.

C'est une impasse.

Le serveur sélectionne une transaction à tuer, afin qu'elles ne se bloquent pas inutilement.

La détection de blocage permet à un thread de réussir immédiatement au détriment de l'autre. Sinon, ils seraient tous les deux coincés dans la serrure jusqu'à ce que l'un d'eux meure d'avoir attendu trop longtemps.

Vous êtes en mode autocommit, mais bien sûr, cela ne signifie pas que vous n'êtes pas dans une transaction. Chaque requête avec InnoDB est toujours gérée dans une transaction, mais avec la validation automatique, la transaction est implicitement lancée lorsque la requête commence à s'exécuter et implicitement validée lorsqu'elle réussit.