Si consideri il seguente SQL:Do Inserted Records ricevere sempre Identità Contiguo Valori
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()
Vorrei sapere se posso dipendere dai 1000 righe che ho inserito nella tabella Foo avere valori di identità contigui. Nelle parole di ordine, se questo blocco SQL produce un @LastID di 2000, posso sapere con certezza che l'ID del primo record che ho inserito era 1001? Sono principalmente curioso di più affermazioni che inseriscono record nella tabella Foo contemporaneamente.
So che potrei aggiungere una transazione serializzabile attorno alla mia istruzione di inserimento per garantire il comportamento che voglio, ma ho davvero bisogno? Sono preoccupato che l'introduzione di una transazione serializzabile riduca le prestazioni, ma se SQL Server non consentirà l'inserimento di altre istruzioni nella tabella Foo mentre questa istruzione è in esecuzione, non devo preoccuparmene.
Scoperta molto interessante! Apprezzo che tu abbia messo insieme questo test. Ho anche provato a racchiudere l'istruzione "Insert 1000 records" in una transazione serializzabile, ma senza alcun risultato, ho ancora i record interlacciati. MA, se inserisco "Insert 1000 records" in una transazione serializzabile e chiami SELECT MAX (ID) FROM Foo all'interno della transazione prima del mio inserimento, posso quindi garantire che i miei record saranno contigui. Questa soluzione previene tuttavia inserimenti simultanei e non sono disposto a prendere il colpo di performance che potrebbe causare. –
@John - serializzabile su un heap acquisirà solo un esclusivo lock da tavolo, penso che tu possa ottenere lo stesso effetto con un semplice suggerimento di blocco. 'WITH (TABLOCKX)' Come dici tu, questo avrà un impatto sulla concorrenza. –
mio errore, nel test ero in esecuzione ho aggiunto un PK alla colonna ID sul tavolo Foo, dal momento che più da vicino rappresentava la mia situazione. –