Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Condition de concurrence de file d'attente de processus SQL Server

Modifier :

J'ai cherché sur Google pour vérifier ma réponse :"Traitement des files d'attente de données dans SQL Server avec READPAST et UPDLOCK". Cela fait des années que je n'ai pas lu et joué avec cette solution.

Original :

Si vous utilisez l'indicateur READPAST, les lignes verrouillées sont ignorées. Vous avez utilisé ROWLOCK, vous devez donc éviter l'escalade des verrous. Vous avez également besoin de UPDLOCK, comme je l'ai découvert.

Ainsi, le processus 1 verrouille 20 lignes, le processus 2 prend les 20 suivantes, le processus 3 prend les lignes 41 à 60, etc

La mise à jour peut également être écrite comme ceci :

UPDATE TOP (20)
    foo
SET
    ProcessorID = @PROCID
FROM
    OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
    ProcessorID = 0

Actualisation, octobre 2011

Cela peut être fait de manière plus élégante avec la clause OUTPUT si vous avez besoin d'un SELECT et d'un UPDATE en une seule fois.