[MS-SQL] COMMIT TRANSACTION(Transact-SQL)

개발자 | 2010. 12. 27. 22:26

Transact-SQL 프로그래머는 트랜잭션에서 참조되는 모든 데이터가 논리적으로 정확할 때만 COMMIT TRANSACTION을 실행해야 합니다.

커밋된 트랜잭션이 Transact-SQL 분산 트랜잭션일 경우 COMMIT TRANSACTION은 MS DTC가 2단계 커밋 프로토콜을 사용하여 트랜잭션에 포함된 모든 서버를 커밋하도록 트리거합니다. 로컬 트랜잭션이 데이터베이스 엔진의 동일한 인스턴스에서 둘 이상의 데이터베이스와 관련되어 있을 경우 인스턴스는 내부적으로 2단계 커밋을 사용하여 트랜잭션에 포함된 모든 데이터베이스를 커밋할 수 있습니다.

COMMIT TRANSACTION을 중첩된 트랜잭션에서 사용할 경우 내부 트랜잭션을 커밋해도 리소스가 해제되거나 수정 내용이 영구적으로 반영되지 않습니다. 이런 경우 외부 트랜잭션을 커밋해야만 데이터 수정 내용이 영구적으로 반영되고 리소스가 해제됩니다. @@TRANCOUNT가 1보다 클 때는 COMMIT TRANSACTION을 실행할 때마다 @@TRANCOUNT가 1씩 감소되며 @@TRANCOUNT가 0이 되면 전체 외부 트랜잭션이 커밋됩니다. transaction_name은 데이터베이스 엔진에서 무시되므로 완료되지 않은 내부 트랜잭션이 있더라도 외부 트랜잭션의 이름을 참조하는 COMMIT TRANSACTION을 실행하면 @@TRANCOUNT가 1만큼 줄어듭니다.

@@TRANCOUNT가 0일 때 COMMIT TRANSACTION을 실행하면 해당 BEGIN TRANSACTION이 없다는 오류 메시지가 나타납니다.

COMMIT TRANSACTION 문을 실행한 후에는 데이터 수정 내용이 데이터베이스에 영구적으로 반영되므로 트랜잭션을 롤백할 수 없습니다.

SQL Server 2000 이상의 데이터베이스 엔진은 문이 시작될 때 트랜잭션 수가 0인 경우에만 문에서 트랜잭션 수를 증가시킵니다. SQL Server 버전 7.0에서는 문 시작 시 트랜잭션 수와 상관없이 항상 증가합니다. 이로 인해 트리거에서 @@TRANCOUNT에 의해 반환된 값이 SQL Server 버전 7.0보다 SQL Server 2000 이상에서 작아집니다.

SQL Server 2000 이상에서 COMMIT TRANSACTION 또는 COMMIT WORK 문이 트리거에서 실행되고 트리거 시작 시 해당 명시적 또는 암시적 BEGIN TRANSACTION 문이 없을 경우 SQL Server 버전 7.0과는 다른 동작이 수행될 수 있습니다. COMMIT TRANSACTION 또는 COMMIT WORK 문을 트리거에 넣지 않는 것이 좋습니다.

,