lah*_*rah 12 sql t-sql select atomic sql-server-2008
我在一个带有Status列的表中有许多记录,我想选择一个Status = Pending的单个记录,并在同一个原子查询中将它标记为Status = InProcess.最好的方法是什么?
这是必需的,因为多个查询可以在尝试处理这些记录的同时运行,并且我不希望两个线程获取相同的记录来处理.
Dal*_*lex 16
您可以使用OUTPUT子句:
UPDATE [table]
SET Status = 'InProcess'
OUTPUT deleted.*
WHERE Status = 'Pending'
Run Code Online (Sandbox Code Playgroud)
如果要获取具有新状态的行或在旧时删除,则可以使用插入的表名.
这是一篇关于将表用作队列的文章.
有了这个表,这样的create table T (ID int identity, Status varchar(15))
东西可以让你免于死锁.
;with cte as
(
select top 1 *
from T with (rowlock, readpast)
where Status = 'Pending'
order by ID
)
update cte
set Status = 'InProcess'
output inserted.ID, inserted.Status
Run Code Online (Sandbox Code Playgroud)