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 ?
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!