原子更新声明?

时间:2016-09-12 09:41:47

标签: sql-server sql-server-2008 tsql sql-update

在许多情况下,我需要从SQL Server中的数字系列中获取唯一标识符。我所拥有的是一个包含数字系列名称,最小值,最大值和当前值的表。

Series        Min        Max        Current
-------------------------------------------
Testseries    1          999        23

现在我使用UPDATE ... OUTPUT语句安全地递增并输出当前值。所有其他方法(例如:UPDATE当前和SELECT必然会迟早导致竞争条件。

现在我发现了以下语法:

DECLARE @newId INT
UPDATE Numberseries
SET
    @newId = Current += 1
WHERE
    Series = '...'

这可以在任何时候起作用,我只更新一行,因为Series是主键。

我的问题是:这也是一个像UPDATE ... OUTPUT语句那样的原子操作,这样两个客户端在同时调用中得不到相同的值吗?

1 个答案:

答案 0 :(得分:0)

您不应该使用表格,因为UPDATE实际上不是原子的(至少在某些DBS上)!如果INSERT使用了值且对该值有UNIQUE - 约束,则可以使用它;你必须在碰撞后重试。

真正的解决方案是使用SEQUENCE - 这就是他们的目的。