使用默认隔离级别: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中使用新的序列对象,也不是标识列可以使用的场景。
答案 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只有一行,这不能正常工作吗?