Consideremos el siguiente código SQL:Do insertados Records Recibe Siempre Identidad Contigua Valores
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()
me gustaría saber si puedo depender de las 1000 filas que se inserta en la tabla de Foo tener valores de identidad contiguos. En otras palabras, si este bloque SQL produce un @LastID de 2000, ¿puedo saber con certeza que el ID del primer registro que inserté fue 1001? Principalmente me interesan las declaraciones múltiples que insertan registros en la tabla Foo al mismo tiempo.
Sé que podría agregar una transacción serializable alrededor de mi declaración de inserción para garantizar el comportamiento que quiero, ¿pero realmente lo necesito? Me preocupa que la introducción de una transacción serializable deteriorará el rendimiento, pero si SQL Server no permite que otras instrucciones se inserten en la tabla Foo mientras se ejecuta esta declaración, entonces no tengo que preocuparme por ello.
¡Muy interesante descubrimiento! Te agradezco que hayas armado esta prueba. Incluso traté de ajustar la declaración "Insertar 1000 registros" en una transacción serializable, pero fue en vano, aún recibo registros intercalados. PERO, si coloco "Insertar 1000 registros" en una transacción serializable Y llamo SELECCIONAR MAX (ID) DE Foo dentro de la transacción antes de mi inserción, puedo garantizar que mis registros serán contiguos. Esta solución evita insertos simultáneos, sin embargo, y no estoy dispuesto a tomar el golpe de rendimiento que podría causar. –
@John - serializable en un montón simplemente adquirirá un exclusivo bloqueo de mesa, creo que así podría obtener el mismo efecto con una simple pista de bloqueo. 'WITH (TABLOCKX)' Como dices, esto tendrá un impacto en la concurrencia. –
mi error, en la prueba que estaba ejecutando agregué un PK a la columna ID en la tabla Foo, ya que eso representaba más de cerca mi situación. –