1

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

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

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

4

1 回答 1

1

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

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 只有一行,这不会很好吗?

于 2012-12-10T19:00:21.850 回答