De nombreux processus .NET lisent les messages d'une table DB SQL Server 2008 et les traitent un à la fois. J'implémente un simple SP pour «verrouiller» la ligne lue par un processus, pour éviter que deux processus ne traitent la même ligne.Bloquer une ligne à partir des lectures pendant que sp s'exécute
BEGIN TRAN
SELECT @status = status FROM t WHERE t.id = @id
IF @status = 'L'
BEGIN
-- Already locked by another process. Skip this
RETURN 0
END
ELSE
UPDATE t SET status = 'L' WHERE id = @id
RETURN 1
END
COMMIT
Cependant, ceci est erronée: parfois une rangée se « verrouillé » et traité deux fois. Je soupçonne qu'il y a un problème de concurrence: deux processus lisant l'état avant de le mettre à jour.
Je pense que cela pourrait être résolu en mettant en œuvre un bloc de lecture en quelque sorte (c'est-à-dire que le bloc de transactions READs), mais je ne sais pas comment faire cela. Quelqu'un peut-il aider?
Merci beaucoup à l'avance
Ryan
Je devrais ajouter que les processus sont des processus .net distincts, pas une exécution unique multithread, donc cela ne peut pas être résolu à un niveau de programmation C#. – Ryan