2013-11-21 24 views
0

我們有一個應用程序必須生成唯一的連續序列號並將範圍存儲在數據庫中。我們只需要登錄號碼的範圍,我們存儲實際的其他地方處理併發連接時,從SQL Server生成一個序列號塊?

它基本上怎樣的設置現在是我們有三列SequenceStartNumberSequenceEndNumber,並AllocatedFor一個簡單的表。

因此,例如,該行可能看起來像這樣:

SequenceStartNumber SequenceEndNumber AllocatedFor 
1      1000    CustomerXYZ 
1001     2000    CustomerZZY 

一段代碼會做一個查詢與

SELECT MAX(SequenceEndNumber) + 1 AS FirstNumber 
FROM SequenceNumberAllocation 

代碼獲取此查詢的結果,就如何增加它知道它需要的很多序列號,並執行一個插入與

INSERT INTO SequenceNumberAllocation (SequenceStartNumber, SequenceEndNumber, AllocatedFor) 
VALUES (%d, %d, 'CustomerABC') 

這樣我們有一個運行李這些數字塊,以及誰在使用它們。

這很好地工作,除了很明顯這種方法不能說明併發性。假設(尚未發生)兩個同時進程可以同時執行第一個查詢並獲取相同的起始數字。

什麼是最好的方式來重新考慮這一點,在插入子句完成之前阻止表?該操作是否應該以某種方式形成存儲過程? SQL並不是我最強的花色,所以我不得不問什麼可能是你剩下的基本問題。謝謝你的時間。

回答

9
BEGIN TRANSACTION; 

INSERT INTO dbo.SequenceNumberAllocation 
(
    SequenceStartNumber, 
    SequenceEndNumber, 
    AllocatedFor 
) 
SELECT 
    MAX(SequenceEndNumber) + 1, 
    MAX(SequenceEndNumber) + @HoweverManyNumbersYouNeed, 
    'Customer ABC' 
FROM dbo.SequenceNumberAllocation WITH (HOLDLOCK); 

COMMIT TRANSACTION; 
+0

簡單而有效。我說我對SQL不好:)非常感謝! –

+0

向下選民,關心評論? –

+0

我低估了你的意志! – Zane