2012-11-27 94 views
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 

感謝

+2

什麼版本的SQL Server? 2012有序列,以前的版本有'IDENTITY'列。如果你解釋爲什麼你想爲自己的代碼編寫代碼會有幫助嗎? – Pondlife

+0

[在Sql Server中創建序列]的可能重複(http://stackoverflow.com/questions/1834733/creating-sequence-in-sql-server) –

+0

以下是2012年的操作方法:http://stackoverflow.com/a/39774566/3347858 –

回答

2

是的,我會被調用存儲過程。

是否有某些原因導致您無法識別字段(即:identity(1,1))?

如果你想使用上面的代碼,你應該把它包裝在一個可序列化的事務中,並處理任何死鎖情況。

+0

但是我的問題是關於「是否UPDATE語句是原子的?..如果是這樣..那麼它默認情況下是隱式事務。如果這是真的..那麼爲什麼包裝在事務中?它可以陷入僵局嗎?「 對不起。如果我原來的問題不清楚。 謝謝 – kudlur

2

爲什麼你不使用身份列?

IDENTITY [ (seed ,increment) ] 

IDENTITY (Property)

EG。

CREATE TABLE SequenceGenerator 
(
    Sequence INT IDENTITY(1,1) 
) 
0

這不是很漂亮,但我已經在SQL Server 2008 R2以下工作好幾年了,它從來沒有讓我失望:

我有一個表有「名」和「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或更高版本的序列對象。

0

這將做到這一點,你不會遇到併發問題。

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

DECLARE @NextSequence INT 

UPDATE SequenceGenerator 
SET @NextSequence = Sequence = Sequence + 1 

@NextSequence將遞增值