트랜잭션 제어(데이터베이스 엔진)
응용 프로그램은 주로 트랜잭션 시작 및 종료 시기를 지정하여 트랜잭션을 제어합니다. 트랜잭션 시작 및 종료 시기는 Transact-SQL 문 또는 데이터베이스 API(응용 프로그래밍 인터페이스) 함수를 사용하여 지정할 수 있습니다. 시스템은 트랜잭션을 불완전하게 종료하는 오류를 올바르게 처리할 수도 있어야 합니다.
기본적으로 트랜잭션은 연결 수준에서 관리됩니다. 한 연결에서 트랜잭션이 시작되면 트랜잭션이 끝날 때까지 해당 연결에서 실행되는 모든 Transact-SQL 문은 트랜잭션의 일부가 됩니다. 그러나 MARS(Multiple Active Result Set) 세션에서는 Transact-SQL 명시적 또는 암시적 트랜잭션이 일괄 처리 수준에서 관리되는 일괄 처리 범위의 트랜잭션이 됩니다. 일괄 처리가 완료될 때 일괄 처리 범위의 트랜잭션이 커밋되거나 롤백되지 않으면 SQL Server에서 해당 트랜잭션을 자동으로 롤백합니다.
트랜잭션 시작
API 함수와 Transact-SQL 문을 사용하여 SQL Server 데이터베이스 엔진 인스턴스에서 명시적, 자동 커밋 또는 암시적 트랜잭션을 시작할 수 있습니다. MARS 세션에서는 Transact-SQL 명시적 트랜잭션과 암시적 트랜잭션이 일괄 처리 범위의 트랜잭션이 됩니다.
명시적 트랜잭션
API 함수를 사용하거나 Transact-SQL BEGIN TRANSACTION 문을 실행하여 트랜잭션을 명시적으로 시작합니다.자동 커밋 트랜잭션
데이터베이스 엔진의 기본 모드입니다. 각 Transact-SQL 문은 완료 시 커밋됩니다. 트랜잭션 제어를 위한 문을 지정하지 않아도 됩니다.암시적 트랜잭션
API 함수나 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 문을 통해 암시적 트랜잭션 모드를 설정합니다. 다음 문은 자동으로 새 트랜잭션을 시작합니다. 이 트랜잭션이 완료되면 다음 Transact-SQL 문이 새 트랜잭션을 시작합니다.일괄 처리 범위의 트랜잭션
MARS(Multiple Active Result Sets)에만 해당되며, MARS 세션에서 시작되는 Transact-SQL 명시적 또는 암시적 트랜잭션이 일괄 처리 범위 트랜잭션이 됩니다. 일괄 처리가 완료될 때 커밋되거나 롤백되지 않은 일괄 처리 범위의 트랜잭션은 SQL Server에서 자동으로 롤백합니다.
트랜잭션 모드는 연결 수준에서 관리됩니다. 한 연결에서 트랜잭션 모드가 변경되어도 다른 연결의 트랜잭션 모드에는 영향을 주지 않습니다.
트랜잭션 종료
COMMIT 또는 ROLLBACK 문을 사용하거나 API 함수를 통해 트랜잭션을 종료할 수 있습니다.
COMMIT
트랜잭션이 성공하면 커밋합니다. COMMIT 문을 사용하면 모든 트랜잭션 수정이 영구적으로 데이터베이스의 일부로 적용됩니다. COMMIT은 또한 트랜잭션에 사용된 잠금과 같은 리소스를 해제합니다.ROLLBACK
트랜잭션에서 오류가 발생하거나 사용자가 트랜잭션을 취소하려고 결정한 경우 트랜잭션을 롤백합니다. ROLLBACK 문은 데이터를 트랜잭션이 시작되기 전 상태로 되돌려서 트랜잭션 진행 중 수정된 모든 내용을 취소합니다. ROLLBACK은 또한 트랜잭션에서 보유 중인 리소스를 해제합니다.
[!참고]
MARS를 지원하도록 설정된 연결에서는 실행 보류 중인 요청이 있을 경우 API 함수를 통해 시작한 명시적 트랜잭션을 커밋할 수 없습니다. 보류 중인 작업이 있는 동안 이러한 유형의 트랜잭션을 커밋하려고 하면 오류가 발생합니다.
트랜잭션 경계 지정
Transact-SQL 문이나 API 함수 및 메서드를 사용하여 데이터베이스 엔진 트랜잭션이 시작하고 끝나는 시기를 확인할 수 있습니다.
Transact-SQL 문
BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK 및 SET IMPLICIT_TRANSACTIONS 문을 사용하여 트랜잭션을 설명합니다. 이 문들은 주로 osql 명령 프롬프트 유틸리티를 사용하여 실행되는 스크립트 등의 Transact-SQL 스크립트 및 DB-Library 응용 프로그램에서 사용됩니다.API 함수 및 메서드
ODBC, OLE DB 및 ADO 등의 데이터베이스 API와 .NET Framework SQLClient 네임스페이스에는 트랜잭션을 설명하는 함수나 메서드가 포함됩니다. 이러한 함수나 메서드는 데이터베이스 엔진 응용 프로그램에서 트랜잭션을 제어하는 데 사용되는 기본 메커니즘입니다.
각 트랜잭션은 이러한 방법 중 하나만 사용하여 관리해야 합니다. 같은 트랜잭션에서 두 방법을 모두 사용하면 예상치 못한 결과가 나타날 수 있습니다. 예를 들어 ODBC API 함수를 사용하여 트랜잭션을 시작한 경우에는 Transact-SQL COMMIT 문을 사용하여 트랜잭션을 완료해서는 안 됩니다. 이러한 방법에서는 SQL Server ODBC 드라이버에게 트랜잭션이 커밋되었다는 것을 알릴 수 없기 때문입니다. 이 경우 ODBC SQLEndTran 함수를 사용하여 트랜잭션을 종료합니다.
트랜잭션 처리 중 오류
오류로 인해 트랜잭션이 성공적으로 완료되지 않은 경우 SQL Server에서는 자동으로 트랜잭션을 롤백하고 해당 트랜잭션에 보유 중인 모든 리소스를 해제합니다. 클라이언트와 데이터베이스 엔진 인스턴스 간의 네트워크 연결이 끊어진 경우 네트워크에서 이 인스턴스에게 연결이 끊어진 것을 알릴 때 해당 연결에서 보류 중인 트랜잭션은 모두 롤백됩니다. 클라이언트 응용 프로그램에 오류가 발생하거나 클라이언트 컴퓨터가 다운 또는 다시 시작되는 경우에도 네트워크 연결은 끊어지고 데이터베이스 엔진 인스턴스는 네트워크에서 연결이 끊어진 것을 확인하면 보류 중인 트랜잭션을 모두 롤백합니다. 클라이언트가 응용 프로그램에서 로그오프하면 보류 중인 트랜잭션은 모두 롤백됩니다.
일괄 처리에서 제약 조건 위반 등 런타임 문 오류가 발생하면 데이터베이스 엔진에서는 기본적으로 오류를 발생시킨 문만 롤백합니다. 이 동작은 SET XACT_ABORT 문을 사용하여 변경할 수 있습니다. SET XACT_ABORT ON이 실행된 후에는 모든 런타임 문 오류 발생 시 자동으로 현재 트랜잭션이 롤백됩니다. 구문 오류와 같은 컴파일 오류는 SET XACT_ABORT 옵션의 영향을 받지 않습니다. 자세한 내용은 SET XACT_ABORT(Transact-SQL)를 참조하십시오.
오류가 발생하면 수정 동작(COMMIT 또는 ROLLBACK)을 응용 프로그램 코드에 포함해야 합니다. 트랜잭션 오류를 포함하여 오류를 효과적으로 처리할 수 있는 도구로는 Transact-SQL TRY…CATCH 구문이 있습니다. 트랜잭션이 포함된 예를 보려면 Transact-SQL에서 TRY...CATCH 사용 및 TRY...CATCH(Transact-SQL)를 참조하십시오.