Maison >base de données >tutoriel mysql >Comment résoudre une condition de concurrence critique avec SQL Server dans une file d'attente de traitement de commande ?

Comment résoudre une condition de concurrence critique avec SQL Server dans une file d'attente de traitement de commande ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-18 01:26:12718parcourir

How to Resolve a SQL Server Race Condition in an Order Processing Queue?

Résolution des conditions de concurrence entre SQL Server dans le traitement des commandes

Cet article aborde un problème courant : plusieurs processeurs de commandes rencontrent des conditions de concurrence lors de l'accès à une file d'attente de commandes via une procédure stockée. La procédure stockée utilise un identifiant unique pour verrouiller les 20 prochaines commandes à traiter. Cependant, un accès simultané peut conduire plusieurs processeurs à réclamer la même commande, ce qui entraîne des erreurs de traitement.

La cause première est la visibilité des transactions non validées. Même avec ROWLOCK, qui empêche généralement l'accès simultané aux lignes, les modifications non validées ne sont pas visibles pour les autres processeurs vérifiant les verrous. Cela crée la condition de concurrence.

La solution consiste à utiliser les indices READPAST et UPDLOCK dans vos déclarations SELECT et UPDATE. READPAST indique à la base de données de contourner les lignes verrouillées, évitant ainsi les interférences des mises à jour non validées. UPDLOCK garantit un verrouillage exclusif sur les lignes mises à jour jusqu'à la validation de la transaction, empêchant les autres processeurs de les modifier.

Voici le code amélioré intégrant ces astuces :

<code class="language-sql">BEGIN TRAN
    UPDATE TOP (20) foo
    SET ProcessorID = @PROCID
    FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
    WHERE ProcessorID = 0
COMMIT TRAN

SELECT OrderID, ProcessorID, etc...
FROM OrderTable
WHERE ProcessorID = @PROCID</code>

Pour une efficacité accrue, pensez à utiliser la clause OUTPUT. Cela fusionne les opérations SELECT et UPDATE, mettant à jour la table et renvoyant les lignes modifiées en une seule étape. Cela élimine le besoin d'une SELECT déclaration distincte.

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