SQL Server中的原子更新列

时间:2014-03-14 10:35:04

标签: sql sql-server locking

我正在使用MS SQL Server,我有一个表。我希望每个SQL Server客户端获取一行并更新它,以便客户端知道只有他获得了该记录,而没有其他人!

record1 a b c 0
record2 d e f 0
...

一个客户端应该从0到1获取并更新最后一个值。

该解决方案至少应该适用于SQL Server 2005及更高版本。

ATOMIC
{
    select top 1 * from table where column='0' // get one row where column is '0'
    update table set column='1'
}

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

update top (1) table with (readpast)
set Column1=1
output inserted.*
where Column1 = 0

哪个应该一气呵成。您只需要readpast提示,如果获取了唯一值,则连接会使交易长时间保持打开状态。如果你只是进行更新,你可以省略它。

答案 1 :(得分:0)

您可以通过公用表表达式更新表。

下面我创建一个CTE,只选择一行,然后在UPDATE中使用。

WITH
  singleRow AS
(
  select top 1 * from table where column='0'
)
UPDATE
  singleRow
SET
  column= '1'
;

注意: 请务必确保使用;终止前面的任何命令,否则WITH语法不起作用。