如何从数据库中选择记录并在原子查询中更新它

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)

如果要获取具有新状态的行或在旧时删除,则可以使用插入的表名.


Mik*_*son 6

这是一篇关于将表用作队列的文章.

有了这个表,这样的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)

  • +1我虽然使用`with(rowlock,updlock,readpast). (2认同)