Votre système de traitement des commandes connaît des conditions de concurrence car plusieurs processeurs récupèrent les mêmes enregistrements. Voici comment résoudre ce problème :
Comprendre le problème :
Le problème vient de l'utilisation par la procédure stockée d'un indice ROWLOCK
combiné à une sélection dans une vue verrouillée séparément. Cela permet à plusieurs processeurs de verrouiller le même enregistrement, entraînant une corruption des données.
Solution utilisant des astuces :
Pour résoudre la condition de concurrence critique, utilisez les astuces READPAST
et UPDLOCK
:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) OrderTable foo SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
READPAST
évite les lignes verrouillées lors de la sélection, garantissant ainsi une exécution continue des requêtes. UPDLOCK
garantit un verrouillage approprié lors de la mise à jour, empêchant les modifications simultanées.
Une solution plus efficace :
Une approche plus rationalisée utilise la clause OUTPUT
pour combiner les opérations SELECT
et UPDATE
:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo OUTPUT OrderID, ProcessorID, etc... SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, UPDLOCK, READPAST) WHERE ProcessorID = 0 COMMIT TRAN</code>
Cela élimine le besoin d'une instruction SELECT
distincte, améliorant ainsi l'efficacité et la clarté du code.
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!