3902: The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION (대응하는 BEGIN TRANSACTION이 없는 COMMIT TRANSACTION)
SQL Server의미
COMMIT TRANSACTION이 실행되었으나 대응하는 열린 BEGIN TRANSACTION이 없다. 트랜잭션 수(@@TRANCOUNT)가 0이므로 커밋할 트랜잭션을 찾지 못했다.
원인
BEGIN/COMMIT/ROLLBACK 사용의 불균형, 오류 후 트랜잭션이 이미 롤백됨, 중첩 트랜잭션 수의 잘못된 관리, 또는 CATCH 블록에서 ROLLBACK 후 COMMIT을 다시 호출함.
해결 방법
BEGIN과 COMMIT 문의 수를 맞춘다. 커밋 전에 @@TRANCOUNT를 확인한다(IF @@TRANCOUNT > 0 COMMIT). TRY...CATCH에서는 오류 시 XACT_STATE()/@@TRANCOUNT에 따라 ROLLBACK하고 불필요한 COMMIT을 방지한다. 중첩 트랜잭션 로직을 검토한다.
같은 데이터베이스의 다른 항목
- 2714There is already an object named in the database (데이터베이스에 같은 이름의 개체가 이미 있음)
- 601Could not continue scan with NOLOCK due to data movement (데이터 이동으로 NOLOCK 스캔을 계속할 수 없음)
- 50000Custom error raised with RAISERROR (RAISERROR로 발생시킨 사용자 정의 오류)
- 1101Could not allocate a new page because of insufficient disk space in filegroup (파일 그룹의 디스크 공간 부족으로 새 페이지를 할당할 수 없음)
- 3729Cannot DROP because it is being referenced by object (객체가 참조 중이어서 DROP 불가)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement (객체가 DDL로 변경되어 스냅샷 격리 트랜잭션 실패)
- 1785Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (FOREIGN KEY 제약 조건이 순환 또는 다중 cascade 경로를 만들 수 있음)