2016-04-04 60 views
0

我有一個序列,我想自動從中檢索幾個連續的值。原子檢索連續範圍從SEQUENCE

據我所知,序列不支持事務。

標準NEXT VALUE FORsyntax不能幫助,而在其他數據庫中可以這樣做。

我發現sp_sequence_get_rangefunction,但我不確定它是否是原子。測試這種情況非常棘手。

這可能嗎?

+0

「原子」,如「全部或全部」?你期望什麼樣的部分? –

+0

我的意思是我需要連續數字,沒有可能由於併發訪問序列造成的空白。例如,如果兩個進程同時請求值爲0的序列中的10個數字,我希望他們總是得到範圍[0-9]和[10-19],沒有間隙。 – astef

回答

2

總之,是的,序列有你正在尋找的屬性。

現在有點爲什麼。在它們的基礎上,序列只是系統表中的一行,其中包含表示序列中當前值的列。通常,當您撥打NEXT VALUE FOR時,SQL Server會提取該當前值,將該值遞增1,最後返回提取的值。當您使用sp_sequence_get_range時,它會做同樣的事情,除了它將值增加了您請求範圍的大小(例如,如果您使用@range_size = 10調用它,則會將該值增加10)。

我很好奇的一件事是,包含sp_sequence_get_range過程調用的事務的回滾是否也回滾了該範圍的分配。我很高興地報告說它沒有。所以,你不需要擔心兩個調用該過程的值相同。

最後,我提醒你注意無間隙序列的謬誤。如果你得到一個範圍,並且該線程因任何原因死亡(例如,你的應用程序終止,SQL Server預期或意外關閉),那麼該序列將永遠丟失。也就是說,沒有將「未使用」範圍放回隊列中,以便範圍的下一個呼叫獲得該範圍。