Éviter les blocages MySQL dans une table d'utilisateurs en ligne
L'apparition des erreurs « Deadlock trouvé lors de la tentative d'obtention du verrou ; essayez de redémarrer la transaction » peut être un problème frustrant. De tels blocages surviennent lorsque plusieurs transactions tentent d'acquérir des verrous sur des ressources dans un ordre contradictoire. Pour résoudre ce problème, envisagez les solutions suivantes :
Opérations de tri
Des blocages se produisent souvent en raison d'opérations qui tentent de verrouiller les clés dans des ordres différents. Établissez un ordre cohérent pour les clés de verrouillage en triant vos requêtes en conséquence. Par exemple, si vous avez plusieurs requêtes qui verrouillent à la fois la clé (1) et la clé (2), assurez-vous qu'elles obtiennent toujours les verrous dans le même ordre.
Commandez la requête DELETE
Votre requête DELETE doit également être modifiée pour fonctionner dans un ordre croissant. La requête optimisée suivante permettra d'y parvenir :
DELETE FROM onlineusers WHERE id IN ( SELECT id FROM onlineusers WHERE datetime < NOW() - INTERVAL 900 SECOND ORDER BY id ) u;
Nouvelles tentatives automatiques des clients
La documentation MySQL recommande des tentatives automatiques des clients en cas de blocage. Implémentez cette logique dans votre code client, en définissant un nombre spécifique de tentatives (par exemple, 3) avant d'abandonner.
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!