2

我需要生成一个序列号用作主键(在遗留系统中)

我想知道以下解决方案在竞争条件下是否存在并发问题。

CREATE TABLE SequenceGenerator
(
    Sequence INT
)

INSERT INTO SequenceGenerator SELECT 0

这是我需要下一个序列号时调用的存储过程

CREATE PROCEDURE GetNextSequence
AS
    SET NOCOUNT ON
    DECLARE @NextSequence INT
    UPDATE SequenceGenerator SET
    @NextSequence = Sequence,
    Sequence = Sequence + 1
    RETURN @NextSequence + 1

谢谢

4

4 回答 4

2

是的。

是否有某些原因您不能使用身份字段(即identity(1,1):)?

如果你想使用上面的代码,你当然应该将它包装在一个可序列化的事务中并处理任何死锁情况。

于 2012-11-27T14:44:57.127 回答
2

为什么不使用Identity列?

IDENTITY [ (seed ,increment) ]

身份(财产)

例如。

CREATE TABLE SequenceGenerator
(
    Sequence INT IDENTITY(1,1)
)
于 2012-11-27T14:45:21.500 回答
1

这可以解决问题,您不会遇到并发问题。

CREATE TABLE SequenceGenerator(Sequence INT)
GO
INSERT INTO SequenceGenerator SELECT 0
GO

DECLARE @NextSequence INT

UPDATE SequenceGenerator 
SET @NextSequence = Sequence = Sequence + 1

@NextSequence 将具有递增的值

于 2013-01-18T13:55:23.657 回答
0

它并不漂亮,但多年来我在 SQL Server 2008 R2 中进行了以下工作,并且从未让我失望:

我有一个带有“名称”和“最后值”列的表:

CREATE PROCEDURE [dbo].[ReserveSequence]
@Name varchar(100),
@Count int,
@FirstValue bigint OUTPUT
AS 
BEGIN
SET NOCOUNT ON;

DECLARE @Results TABLE ([LastValue] bigint)

UPDATE [Sequences]
SET [LastValue] = [LastValue] + @Count
OUTPUT INSERTED.LastValue INTO @Results
WHERE [Name] = @Name;

SELECT TOP 1 @FirstValue = [LastValue] + 1 FROM @Results;
RETURN 0;
END

也就是说,如果您的目标是 2012 年或更高版本,我将使用 SEQUENCE 对象。

于 2013-01-08T17:34:39.350 回答