다음과 같은 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()
나는 내가 테이블 푸 연속 ID 값을 가진에 삽입 된 1000 행에 의존 할 수 있는지 알고 싶습니다
. 즉,이 SQL 블록이 @LastID 2000을 생성하는 경우, 내가 삽입 한 첫 번째 레코드의 ID가 1001이라는 것을 확실히 알 수 있습니까? 나는 주로 테이블 Foo에 레코드를 동시에 삽입하는 다중 명령문에 대해 궁금합니다.
내가 원하는 동작을 보장하기 위해 삽입 문 주위에 serializable 트랜잭션을 추가 할 수 있다는 것을 알고 있지만 실제로 필요합니까? 직렬화가 가능한 트랜잭션을 도입하면 성능이 저하되지만, SQL 문에서이 명령문이 실행되는 동안 SQL Server가 다른 명령문을 테이블 Foo에 삽입 할 수 없다면 걱정할 필요가 없습니다.
매우 흥미로운 발견! 이 시험을 함께 해 주셔서 감사합니다. 나는 "1000 레코드 삽입"문장을 직렬화 가능 트랜잭션으로 래핑하려고했지만 아무 소용이 없어도 여전히 인터리브 된 레코드를 얻습니다. 그러나 "Insert 1000 records"를 직렬화 가능 트랜잭션에 넣은 다음 삽입하기 전에 트랜잭션 내에서 SELECT MAX (ID) FROM FROM을 호출하면 내 레코드가 연속적임을 보장 할 수 있습니다. 이 솔루션은 동시 삽입을 방지합니다. 성능에 영향을 줄 수는 없습니다. –
@ 존 - 힙에 직렬화 할 수있는 것은 독점적 인 테이블 잠금을 획득 할 것이므로 직선적 인 잠금 힌트로 동일한 효과를 얻을 수 있다고 생각합니다. 'WITH (TABLOCKX)'이것은 동시성에 영향을 미칠 것이라고 말했듯이. –
내 실수, 테스트에서 나는 테이블 Foo의 ID 컬럼에 PK를 추가했다. –