본문 바로가기
개발언어/SQL

COMMIT TRANSACTION

by 엔돌슨 2008. 1. 8.
반응형

COMMIT TRANSACTION

성공적인 암시적 트랜잭션이나 사용자 정의 트랜잭션의 끝을 표시합니다. @@TRANCOUNT가 1이면 COMMIT TRANSACTION은 트랜잭션이 시작된 이후의 모든 데이터 수정 사항을 데이터베이스에 영구적으로 반영하고 연결에서 보유한 자원을 해제한 후 @@TRANCOUNT를 0으로 감소시킵니다. @@TRANCOUNT가 1보다 크면 COMMIT TRANSACTION은 @@TRANCOUNT를 1씩 감소시킵니다.

구문

COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ]

인수

transaction_name

Microsoft® SQL Server™에서는 무시됩니다. transaction_name은 이전의 BEGIN TRANSACTION에서 할당된 트랜잭션 이름을 지정합니다. transaction_name 식별자에 대한 규칙을 따라야 하지만 트랜잭션 이름의 처음 32자만 사용됩니다. 프로그래머는 transaction_name을 통해 COMMIT TRANSACTION과 연관된 중첩 BEGIN TRANSACTION을 알 수 있으므로 가독성이 향상됩니다.

@tran_name_variable

유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다.

비고

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

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

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

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

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

예제
A. 트랜잭션 커밋

다음은 서적의 현재까지 연간 매출이 $8,000보다 클 경우 저자에게 줄 전도금을 증가시키는 예제입니다.

BEGIN TRANSACTION
USE pubs
GO
UPDATE titles
SET advance = advance * 1.25
WHERE ytd_sales > 8000
GO
COMMIT
GO
B. 중첩된 트랜잭션 커밋

다음은 테이블을 만들고, 세 수준의 중첩된 트랜잭션을 생성한 다음, 중첩된 트랜잭션을 커밋하는 예제입니다. 모든 COMMIT TRANSACTION 문에는 transaction_name 매개 변수가 있지만 COMMIT TRANSACTION과 BEGIN TRANSACTION 문 간에는 아무 관계도 없습니다. transaction_name 매개 변수는 단지 @@TRANCOUNT를 0으로 만들고, 외부 트랜잭션을 커밋하기 위해 필요한 개수의 커밋이 코딩되었는지 프로그래머가 확인할 수 있도록 가독성을 높이는 것입니다.

CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
BEGIN TRANSACTION OuterTran -- @@TRANCOUNT set to 1.
GO
INSERT INTO TestTran VALUES (1, 'aaa')
GO
BEGIN TRANSACTION Inner1 -- @@TRANCOUNT set to 2.
GO
INSERT INTO TestTran VALUES (2, 'bbb')
GO
BEGIN TRANSACTION Inner2 -- @@TRANCOUNT set to 3.
GO
INSERT INTO TestTran VALUES (3, 'ccc')
GO
COMMIT TRANSACTION Inner2 -- Decrements @@TRANCOUNT to 2.
-- Nothing committed.
GO
COMMIT TRANSACTION Inner1 -- Decrements @@TRANCOUNT to 1.
-- Nothing committed.
GO
COMMIT TRANSACTION OuterTran -- Decrements @@TRANCOUNT to 0.
-- Commits outer transaction OuterTran.
GO

관련 항목

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT WORK

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

@@TRANCOUNT

트랜잭션