Maison >base de données >tutoriel mysql >Comment puis-je éviter les erreurs de « blocage détecté lors de la tentative d'obtention d'un verrouillage » dans mon système de suivi des utilisateurs en ligne MySQL ?

Comment puis-je éviter les erreurs de « blocage détecté lors de la tentative d'obtention d'un verrouillage » dans mon système de suivi des utilisateurs en ligne MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-15 18:52:15313parcourir

How Can I Prevent

Éviter « un blocage trouvé lors de la tentative d'obtention d'un verrouillage » dans MySQL

Problème :

Un développeur rencontre un message « Deadlock trouvé » par intermittence lorsqu'il tente d'obtenir un verrou ; essayez de redémarrer les erreurs de transaction lors de l'exécution d'INSERT dans une table InnoDB qui suit les activités des utilisateurs en ligne. Le tableau est mis à jour lors de l'actualisation de la page et effacé toutes les 15 minutes par une tâche cron.

Requêtes en question :

  • Première visite : INSERT INTO onlineusers (ip , dateheure, identifiant utilisateur, page, zone, type) VALEURS (ip, now(), identifiant utilisateur, '/thispage', 'thisarea', 3)
  • Actualisation de la page : METTRE À JOUR les utilisateurs en ligne SET ip = ip, datetime = now(), userid = userid, page = '/thispage', area = 'thisarea', type = 3 WHERE id = 888
  • Tâche Cron toutes les 15 minutes : DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 DEUXIÈME

Solution :

Pour résoudre les blocages, il est crucial de garantir que les transactions verrouillent les clés dans un ordre cohérent. Voici les étapes recommandées :

  1. Ordre des clés dans les requêtes :

    • Assurez-vous que toutes les requêtes qui verrouillent plusieurs clés le font de manière ascendante. commande des clés.
  2. Trier Supprimer Déclarations :

    • Modifiez l'instruction DELETE pour inclure une sous-requête qui récupère les valeurs de clé primaire (dans ce cas, id) par ordre croissant, comme ceci :
    DELETE FROM onlineusers
    WHERE id IN (
        SELECT id
        FROM onlineusers
        WHERE datetime <= now() - INTERVAL 900 SECOND
        ORDER BY id
    ) u;
  3. Réessayer Mécanisme :

    • Envisagez d'implémenter un mécanisme de nouvelle tentative dans le code client pour cette erreur spécifique, lui permettant de réessayer automatiquement un nombre limité de fois.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn