Maison > base de données > tutoriel mysql > Comment puis-je éviter les conditions de concurrence lors du traitement des commandes à partir d'une file d'attente SQL Server ?

Comment puis-je éviter les conditions de concurrence lors du traitement des commandes à partir d'une file d'attente SQL Server ?

Mary-Kate Olsen
Libérer: 2025-01-18 01:36:08
original
878 Les gens l'ont consulté

How Can I Prevent Race Conditions When Processing Orders from an SQL Server Queue?

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

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!

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