Verwenden von SQL Server als DB-Warteschlange mit mehreren Clients

Wie kann ich bei einer Tabelle, die als Warteschlange fungiert, die Tabelle / Abfragen am besten so konfigurieren, dass mehrere Clients gleichzeitig aus der Warteschlange verarbeitet werden?

Zum Beispiel gibt die folgende Tabelle einen Befehl an, den ein Worker verarbeiten muss. Wenn der Worker fertig ist, wird der verarbeitete Wert auf true gesetzt.

| ID | COMMAND | PROCESSED |
|  1 | ...     | true      |
|  2 | ...     | false     |
|  3 | ...     | false     |

Die Clients erhalten möglicherweise einen Befehl, mit dem sie arbeiten können:

select top 1 COMMAND 
from EXAMPLE_TABLE 
with (UPDLOCK, ROWLOCK) 
where PROCESSED=false;

Wenn jedoch mehrere Worker vorhanden sind, versucht jeder, die Zeile mit der ID = 2 abzurufen. Nur der erste wird die pessimistische Sperre erhalten, der Rest wird warten. Dann bekommt einer von ihnen Reihe 3 usw.

Welche Abfrage / Konfiguration ermöglicht es jedem Worker-Client, jeweils eine andere Zeile abzurufen und gleichzeitig daran zu arbeiten?

BEARBEITEN

Mehrere Antworten schlagen Variationen bei der Verwendung der Tabelle selbst zur Aufzeichnung eines In-Process-Status vor. Ich dachte, dass dies innerhalb einer einzelnen Transaktion nicht möglich wäre. (d. h., wozu wird der Status aktualisiert, wenn kein anderer Worker ihn sieht, bis der Befehl "txn" festgeschrieben ist?) Möglicherweise lautet der Vorschlag:

# start transaction
update to 'processing'
# end transaction
# start transaction
process the command
update to 'processed'
# end transaction

Ist dies die Art und Weise, wie die Leute dieses Problem normalerweise angehen? Es scheint mir, dass das Problem, wenn möglich, besser von der DB gelöst wird.

Antworten auf die Frage(14)

Ihre Antwort auf die Frage