Rozważmy następujący SQL:Do włożonej płyty zawsze otrzymują Zwarty Tożsamość Wartości
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()
Chciałabym wiedzieć, czy mogę zależeć od 1000 wierszy, które włożyłem w tabeli Foo konieczności ciągłych wartości tożsamości. W słowie porządkowym, jeśli ten blok SQL tworzy @LastID z 2000, czy mogę na pewno wiedzieć, że ID pierwszego wstawionego rekordu to 1001? Jestem głównie ciekawy wielu instrukcji wstawiających rekordy do tabeli Foo jednocześnie.
Wiem, że mogę dodać transakcję do serializacji wokół mojego oświadczenia wstawiania, aby zapewnić zachowanie, które chcę, ale czy naprawdę muszę? Obawiam się, że wprowadzenie transakcji serializowanej obniży wydajność, ale jeśli SQL Server nie pozwoli na wstawianie innych instrukcji do tabeli Foo, gdy ta instrukcja jest uruchomiona, nie muszę się tym martwić.
Bardzo interesujące znalezienie! Doceniam, że składasz ten test. Próbowałem nawet owinąć instrukcję "Wstaw 1000 rekordów" w transakcję serializowalną, ale bez skutku, wciąż dostaję przeplatane rekordy. ALE, jeśli umieściłem "Wstaw 1000 rekordów" w transakcję nadającą się do szeregowania ORAZ zadzwoń do SELECT MAX (ID) OD Foo w transakcji przed moją wstawką, mogę wtedy zagwarantować, że moje rekordy będą ciągłe. To rozwiązanie uniemożliwia równoczesne wstawianie i nie jestem skłonny do przyjęcia trafienia wydajności, które mogłoby spowodować. –
@John - serializowanie na stertę po prostu zdobędzie wyłączną blokadę stołu, więc myślę, że można osiągnąć ten sam efekt dzięki prostej podpowiedzi blokującej. 'WITH (TABLOCKX)' Tak jak mówisz, wpłynie to na współbieżność. –
Mój błąd, w teście, w którym działałem, dodałem PK do kolumny ID na stole Foo, ponieważ to bardziej odzwierciedlało moją sytuację. –