SNAPSHOT 격리 대 TRUNCATE와 관련하여 내가 기대하지 않은이 동작에 대해 누군가가 밝힐 수 있기를 바랍니다.
데이터베이스 : 스냅 샷 격리 허용 = True; 커밋 된 읽기 스냅 샷이 켜져 있습니까? = 거짓입니다.
Procedure1 (많은 조인으로 오래 실행되는 복잡한 SELECT에서 테이블 foo의 내용을 대체합니다) :
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
Procedure2 (테이블 foo에서 읽음) :
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
Procedure2가 실행되는 동안 Procedure1이 실행 중이면 Procedure1이 완료 될 때까지 sp_WhoIsActive에 따라 LCK_M_SCH_S 대기 상태로 Procedure2가 보류됩니다. 그리고 Procedure2가 완료되면이 예외가 발생합니다.
명령문이 액세스 한 오브젝트가이 트랜잭션 시작 이후 다른 동시 트랜잭션의 DDL 문에 의해 수정되었으므로 데이터베이스 'DatabaseName'에서 스냅 샷 격리 트랜잭션이 실패했습니다. 메타 데이터의 버전이 지정되지 않았으므로 허용되지 않습니다. 메타 데이터를 동시에 업데이트하면 스냅 샷 격리와 혼합 된 경우 불일치가 발생할 수 있습니다.
그러나 Microsoft는 SNAPSHOT 격리에서 허용되지 않는 DDL 문으로 TRUNCATE를 표시하지 않습니다. http://msdn.microsoft.com/en-us/library/bb933783.aspx
분명히 TRUNCATE 이전에 테이블에서 가장 최근에 커밋 된 데이터를 즉시 반환하거나 Procedure1에 의해 유지되는 최악의 경우를 반환 한 후 프로 시저 1의 새 내용을 반환 할 것으로 예상되므로 프로 시저 2의 가장 좋은 경우를 예상했을 것입니다. 표. 도울 수 있니?