3961: Snapshot isolation transaction failed because the object was modified by a DDL statement (객체가 DDL로 변경되어 스냅샷 격리 트랜잭션 실패)
SQL Server의미
스냅샷 격리 수준에서 실행 중인 트랜잭션이 접근한 객체가 다른 동시 트랜잭션의 DDL 문(스키마 변경)으로 변경되어 실패했다. 메타데이터는 버전 관리되지 않으므로 스냅샷 트랜잭션이 계속될 수 없다.
원인
SNAPSHOT 격리 수준(SET TRANSACTION ISOLATION LEVEL SNAPSHOT)으로 시작된 트랜잭션이 실행 중일 때 다른 세션이 해당 트랜잭션이 접근하는 테이블에 ALTER TABLE/CREATE INDEX 같은 DDL을 실행한 경우다. 스냅샷 트랜잭션은 행 버전은 볼 수 있지만 스키마 버전은 볼 수 없다. 이 오류는 READ COMMITTED SNAPSHOT(RCSI)에서는 발생하지 않으며, RCSI는 문장마다 새 스냅샷을 사용한다.
해결 방법
트랜잭션을 재시도한다. 보통 DDL이 완료되면 성공한다. 영구 조치로 스냅샷 워크로드가 많지 않은 유지보수 시간에 스키마 변경(DDL)을 수행한다. 애플리케이션에서 이 오류를 잡아 자동 재시도 로직을 구현한다. 장시간 실행되는 스냅샷 트랜잭션을 짧게 줄인다.
같은 데이터베이스의 다른 항목
- 3902The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION (대응하는 BEGIN TRANSACTION이 없는 COMMIT TRANSACTION)
- 1101Could not allocate a new page because of insufficient disk space in filegroup (파일 그룹의 디스크 공간 부족으로 새 페이지를 할당할 수 없음)
- 3729Cannot DROP because it is being referenced by object (객체가 참조 중이어서 DROP 불가)
- 1785Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (FOREIGN KEY 제약 조건이 순환 또는 다중 cascade 경로를 만들 수 있음)
- 9421XML parsing: illegal xml character
- 15151Cannot find the object/principal because it does not exist or you do not have permission (객체/보안 주체가 존재하지 않거나 권한이 없어 찾을 수 없음)
- 4834You do not have permission to use the bulk load statement (bulk load 문을 사용할 권한 없음)