从 SQL Server 数据库中获取“下一行”并在单个事务中对其进行标记

Sql*_*yan 5 t-sql sql-server queue transactions

我有一个用作队列的 SQL Server 表,它正在由多线程(很快将成为多服务器)应用程序处理。我想要一种让进程从队列中声明下一行的方法,将其标记为“进程中”,而不会有多个线程(或多个服务器)同时声明同一行的可能性。

有没有办法更新一行中的标志并同时检索该行?我想要这样的伪代码,但理想情况下,不要阻塞整个表:

Block the table to prevent others from reading
Grab the next ID in the queue
Update the row of that item with a "claimed" flag (or whatever)
Release the lock and let other threads repeat the process
Run Code Online (Sandbox Code Playgroud)

使用 T-SQL 完成此任务的最佳方法是什么?我记得有一次看到一条语句,它会删除行,同时将删除的行存入临时表,这样你就可以对它们做其他事情,但我现在一辈子都找不到它。

Tom*_*Tom 3

您可以使用 OUTPUT 子句

UPDATE myTable SET flag = 1
WHERE
id = 1
AND 
flag <> 1
OUTPUT DELETED.id
Run Code Online (Sandbox Code Playgroud)