請看下面的SQL:待辦事項插入的記錄總是收到毗連的標識值
CREATE TABLE Foo
(
ID int IDENTITY(1,1),
Data nvarchar(max)
)
INSERT INTO Foo (Data)
SELECT TOP 1000 Data
FROM SomeOtherTable
WHERE SomeColumn = @SomeParameter
DECLARE @LastID int
SET @LastID = SCOPE_IDENTITY()
我想知道如果我可以依靠,我插入具有連續的標識值表美孚的1000行。換句話說,如果這個SQL塊生成一個@LastID爲2000,我可以肯定地知道我插入的第一條記錄的ID是1001嗎?我主要好奇多個語句同時向Foo表中插入記錄。
我知道我可以在我的insert語句周圍添加一個可序列化的事務來確保我想要的行爲,但是我真的需要嗎?我擔心引入一個可序列化的事務會降低性能,但是如果SQL Server在這個語句運行時不允許其他語句插入表Foo中,那麼我不必擔心它。
非常有趣的發現!我很感謝你把這個測試放在一起。我甚至試圖在可序列化事務中包裝「插入1000條記錄」語句,但無濟於事,我仍然得到了交錯記錄。但是,如果我將「插入1000條記錄」放入一個可序列化的事務中並在插入之前在事務中調用SELECT MAX(ID)FROM Foo,那麼我可以保證我的記錄是連續的。雖然這個解決方案可以防止同時插入,但我不願意承擔會導致的性能下降。 – 2010-11-19 21:08:17
@John - 在堆上可序列化只會獲得一個獨佔表鎖,我認爲你可以通過一個簡單的鎖定提示實現相同的效果。 WITH(TABLOCKX)'正如你所說,這會影響併發性。 – 2010-11-19 21:11:28
我的錯誤,在我運行的測試中,我在表Foo的ID列中添加了一個PK,因爲這更能代表我的情況。 – 2010-11-19 21:12:53