在不同的会话中使用UPDATE语句增加一个数字是否可靠?

时间:2012-12-10 17:46:34

标签: sql-server-2008 tsql isolation-level

使用默认隔离级别:READ COMMITTED,是否保证以下proc会为每个会话返回不同的编号?基本上,一个会话是否可以与另一个会话同时执行此proc,并返回相同的值。

CREATE PROCEDURE GetNextVersion(@id uniqueidentifier)
AS
BEGIN
    UPDATE MySequenceTable
        SET mySequenceField = mySequenceField + 1 
    OUTPUT INSERTED.mySequenceField
    where IdField = @id
END
GO

注意:我们不能在SQL Server 2012中使用新的序列对象,也不是标识列可以使用的场景。

1 个答案:

答案 0 :(得分:0)

如果在不使用输出子句的情况下在一个语句中获取并设置该值,则无论隔离级别如何(假设没有错误),它都是唯一的。

CREATE PROCEDURE GetNextVersion
@id uniqueidentifier,
@mySequenceField int output
AS
BEGIN
UPDATE MySequenceTable
SET @mySequenceField = mySequenceField,  mySequenceField + 1 
where IdField = @id
END
GO

请注意,变量将首先更新,以便保留表格,使下一个序列值增加。

为什么你在where子句中有一个id?如果MySequenceTable只有一行,这不能正常工作吗?