Éviter les conditions de concurrence dans les files d'attente de commandes SQL Server
Plusieurs processeurs de commandes accèdent à une file d'attente de commandes via une procédure stockée, récupérant 20 commandes chacun. Cela peut provoquer une situation de concurrence critique dans laquelle plusieurs processeurs récupèrent la même commande, entraînant des erreurs de traitement.
Voici une solution pour éliminer ce problème de concurrence :
Une approche utilise l'astuce READPAST
pour contourner les lignes verrouillées, associée à ROWLOCK
pour empêcher l'escalade du verrouillage et à UPDLOCK
pour le verrouillage exclusif des lignes. Cela permet à chaque processeur de verrouiller un lot distinct de lignes (par exemple, le processeur 1 verrouille les lignes 1 à 20, le processeur 2 verrouille les lignes 21 à 40, et ainsi de suite).
La procédure stockée modifiée ressemblerait à ceci :
<code class="language-sql">UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0;</code>
Une autre méthode consiste à utiliser la clause OUTPUT
. Cela combine les opérations SELECT
et UPDATE
en une seule instruction atomique, garantissant la disponibilité immédiate des lignes mises à jour pour le processeur. Cela élimine le besoin d'opérations SELECT
et UPDATE
distinctes, évitant ainsi les conditions de concurrence.
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!