Comprendre et résoudre le blocage d'InnoDB dans MySQL
Lors d'une récente rencontre avec une erreur de blocage MySQL, « Deadlock trouvé lors de la tentative d'obtention du verrou ; essayez de redémarrer la transaction", la cause première a été identifiée comme étant un manque d'ordre cohérent des opérations. Des blocages se produisent lorsque plusieurs connexions tentent d'acquérir des verrous sur des ressources (enregistrements de base de données) dans des séquences opposées.
Pour résoudre ce problème, la solution proposée consiste à appliquer un ordre de verrouillage uniforme pour toutes les requêtes interagissant avec la table affectée. En garantissant que toutes les connexions acquièrent des verrous sur les enregistrements de la base de données de manière cohérente, nous pouvons éliminer la possibilité de blocages.
Tout d'abord, il est essentiel d'identifier toute autre requête susceptible d'acquérir des verrous sur plusieurs clés simultanément. Si elles sont présentes, leurs clauses WHERE doivent être modifiées pour imposer un ordre croissant cohérent sur les clés verrouillées.
Ensuite, l'instruction DELETE chargée de purger les anciens enregistrements doit également être révisée pour fonctionner par ordre croissant. Pour y parvenir, une sous-requête peut être utilisée pour sélectionner d'abord les enregistrements éligibles en fonction du critère d'horodatage. Les enregistrements sélectionnés peuvent ensuite être supprimés dans l'ordre croissant de leurs identifiants, éliminant ainsi le risque de blocages.
Une recommandation supplémentaire inclut la mise en œuvre d'un mécanisme de nouvelle tentative automatique dans le code client. En cas d'erreur de blocage, le client peut être programmé pour tenter quelques tentatives avant d'abandonner l'opération.
En adhérant à ces principes, nous pouvons atténuer efficacement l'apparition de blocages et assurer le bon fonctionnement de MySQL. base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!