다음을 통해 공유


COMMIT TRANSACTION(Transact-SQL)

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

적용 대상: SQL Server(SQL Server 2008 - 현재 버전), Azure SQL 데이터베이스(최초 릴리스 - 현재 릴리스)

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

COMMIT [ { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

인수

  • 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자만이 사용되고 나머지 문자는 잘립니다.

  • DELAYED_DURABILITY
    이 트랜잭션이 지연된 영속성으로 커밋되도록 요청하는 옵션입니다. 데이터베이스가 DELAYED_DURABILITY = DISABLED 또는 DELAYED_DURABILITY = FORCED를 사용하여 변경된 경우 요청이 무시됩니다. 자세한 내용은 트랜잭션 내구성 제어 항목을 참조하십시오.

주의

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 문을 실행한 후에는 데이터 수정 내용이 데이터베이스에 영구적으로 반영되므로 트랜잭션을 롤백할 수 없습니다.

데이터베이스 엔진은 문이 시작될 때 트랜잭션 수가 0인 경우에만 문에서 트랜잭션 수를 증가시킵니다.

사용 권한

public 역할의 멤버 자격이 필요합니다.

1.트랜잭션 커밋

다음 예에서는 작업 후보를 삭제합니다.

USE AdventureWorks2012;
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 AdventureWorks2012;
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

참고 항목

참조

BEGIN DISTRIBUTED TRANSACTION(Transact-SQL)

BEGIN TRANSACTION(Transact-SQL)

COMMIT WORK(Transact-SQL)

ROLLBACK TRANSACTION(Transact-SQL)

ROLLBACK WORK(Transact-SQL)

SAVE TRANSACTION(Transact-SQL)

@@TRANCOUNT(Transact-SQL)