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
Libérer: 2024-12-15 18:52:15
original
312 Les gens l'ont consulté

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;
    Copier après la connexion
  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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal