我需要生成一个序列号作为主键(在遗留系统中)
我想知道以下解决方案在竞争条件下是否会遇到并发问题。
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
由于
答案 0 :(得分:2)
是
是否有某些原因你不能使用身份字段(即:identity(1,1)
)?
如果你想使用上面的代码,你当然应该将它包装在一个可序列化的事务中并处理任何死锁情况。
答案 1 :(得分:2)
为什么不使用身份列?
IDENTITY [ (seed ,increment) ]
例如
CREATE TABLE SequenceGenerator
(
Sequence INT IDENTITY(1,1)
)
答案 2 :(得分:1)
这将解决问题,你不会遇到并发问题。
CREATE TABLE SequenceGenerator(Sequence INT)
GO
INSERT INTO SequenceGenerator SELECT 0
GO
DECLARE @NextSequence INT
UPDATE SequenceGenerator
SET @NextSequence = Sequence = Sequence + 1
@NextSequence将增加值
答案 3 :(得分:0)
它不漂亮,但我已经在SQL Server 2008 R2中工作了多年,并且它永远不会让我失望:
我有一个带有'Name'和'LastValue'列的表:
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对象。