COMMIT TRANSACTION(Transact-SQL)
성공적인 암시적 트랜잭션이나 명시적 트랜잭션의 끝을 표시합니다. @@TRANCOUNT가 1이면 COMMIT TRANSACTION은 트랜잭션이 시작된 이후의 모든 데이터 수정 내용을 데이터베이스에 영구적으로 반영하고 트랜잭션에서 보유한 리소스를 해제한 후 @@TRANCOUNT를 0으로 감소시킵니다. @@TRANCOUNT가 1보다 크면 COMMIT TRANSACTION은 @@TRANCOUNT를 1씩 감소시키고 트랜잭션은 활성 상태를 유지합니다.
구문
COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]
인수
transaction_name
SQL Server 데이터베이스 엔진에서 무시됩니다. transaction_name은 이전의 BEGIN TRANSACTION에서 할당된 트랜잭션 이름을 지정합니다. transaction_name은 식별자 규칙을 따라야 하지만 32자를 초과할 수 없습니다. 프로그래머는 transaction_name을 통해 COMMIT TRANSACTION과 연관된 중첩 BEGIN TRANSACTION을 알 수 있으므로 가독성을 높일 수 있습니다.@tran\_name\_variable
유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다. 33개 이상의 문자가 변수에 전달되는 경우 32자만이 사용되고 나머지 문자는 잘립니다.
주의
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 문을 트리거에 넣지 않는 것이 좋습니다.
사용 권한
public 역할의 멤버 자격이 필요합니다.
예
1. 트랜잭션 커밋
이 예에서는 작업 후보를 삭제합니다.
USE AdventureWorks;
GO
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION;
GO
2. 중첩된 트랜잭션 커밋
이 예에서는 테이블을 만들고 3단계로 중첩된 트랜잭션을 생성한 다음 중첩된 트랜잭션을 커밋합니다. 모든 COMMIT TRANSACTION 문에는 transaction_name 매개 변수가 있지만 COMMIT TRANSACTION과 BEGIN TRANSACTION 문 간에는 아무 관계도 없습니다. transaction_name 매개 변수는 단지 @@TRANCOUNT를 0으로 만들고 외부 트랜잭션을 커밋하기 위해 필요한 수만큼 커밋이 코딩되었는지 프로그래머가 알 수 있도록 확인하는 데 도움이 됩니다.
USE AdventureWorks;
GO
IF OBJECT_ID(N'TestTran',N'U') IS NOT NULL
DROP TABLE TestTran;
GO
CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;
GO
PRINT N'Transaction count after BEGIN OuterTran = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
GO
PRINT N'Transaction count after BEGIN Inner1 = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (2, 'bbb');
GO
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
GO
PRINT N'Transaction count after BEGIN Inner2 = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
INSERT INTO TestTran VALUES (3, 'ccc');
GO
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
GO
PRINT N'Transaction count after COMMIT Inner2 = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
GO
PRINT N'Transaction count after COMMIT Inner1 = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
GO
PRINT N'Transaction count after COMMIT OuterTran = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO