Maison > base de données > tutoriel mysql > Comment puis-je résoudre une condition de concurrence critique sur SQL Server dans le traitement des commandes en raison de la récupération d'enregistrements en double ?

Comment puis-je résoudre une condition de concurrence critique sur SQL Server dans le traitement des commandes en raison de la récupération d'enregistrements en double ?

Patricia Arquette
Libérer: 2025-01-18 01:22:10
original
578 Les gens l'ont consulté

How Can I Resolve a SQL Server Race Condition in Order Processing Due to Duplicate Record Retrieval?

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

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

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

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!

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