COMMIT TRANSACTION(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) 웨어하우스
성공적인 암시적 트랜잭션이나 명시적 트랜잭션의 끝을 표시합니다. 1이면 @@TRANCOUNT
트랜잭션 시작 이후 모든 데이터를 데이터베이스의 영구 부분으로 수정하고 트랜잭션의 리소스를 해제하며 0으로 감소합니다@@TRANCOUNT
. COMMIT TRANSACTION
1보다 크면 @@TRANCOUNT
1 COMMIT TRANSACTION
만 감소 @@TRANCOUNT
하고 트랜잭션은 활성 상태로 유지됩니다.
구문
SQL Server 및 Azure SQL Database 구문
COMMIT [ { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Microsoft Fabric, Azure Synapse Analytics 및 병렬 데이터 웨어하우스 데이터베이스의 Synapse Data Warehouse 구문입니다.
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
인수
transaction_name
적용 대상: SQL Server 및 Azure SQL Database
SQL Server 데이터베이스 엔진 무시됩니다. transaction_name 이전BEGIN TRANSACTION
에서 할당한 트랜잭션 이름을 지정합니다. transaction_name은 식별자 규칙을 따라야 하지만 32자를 초과할 수 없습니다. transaction_name 연결된 중첩된 BEGIN TRANSACTION
프로그래머를 COMMIT TRANSACTION
나타냅니다.
@tran_name_variable
적용 대상: SQL Server 및 Azure SQL Database
유효한 트랜잭션 이름을 포함하는 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다. 변수에 32자 이상이 전달되면 32자만 사용됩니다. 나머지 문자는 잘립니다.
WITH DELAYED_DURABILITY = { OFF | ON }
적용 대상: SQL Server 및 Azure SQL Database
이 트랜잭션이 지연된 영속성으로 커밋되도록 요청하는 옵션입니다. 데이터베이스가 변경되었거나 DELAYED_DURABILITY = FORCED
.로 변경된 경우 요청이 무시됩니다DELAYED_DURABILITY = DISABLED
. 자세한 내용은 트랜잭션 내구성 제어를 참조하세요.
설명
트랜잭션에서 참조하는 모든 데이터가 논리적으로 올바른 경우에만 Transact-SQL 프로그래머가 발급 COMMIT TRANSACTION
해야 합니다.
커밋된 트랜잭션이 Transact-SQL 분산 트랜잭션 COMMIT TRANSACTION
인 경우 MS DTC가 2단계 커밋 프로토콜을 사용하여 트랜잭션에 관련된 모든 서버를 커밋하도록 트리거합니다. 로컬 트랜잭션이 데이터베이스 엔진의 동일한 인스턴스에서 둘 이상의 데이터베이스와 관련되어 있을 경우 인스턴스는 내부적으로 2단계 커밋을 사용하여 트랜잭션에 포함된 모든 데이터베이스를 커밋할 수 있습니다.
COMMIT TRANSACTION을 중첩된 트랜잭션에서 사용할 경우 내부 트랜잭션을 커밋해도 리소스가 해제되거나 수정 내용이 영구적으로 반영되지 않습니다. 이런 경우 외부 트랜잭션을 커밋해야만 데이터 수정 내용이 영구적으로 반영되고 리소스가 해제됩니다. 1보다 클 때 @@TRANCOUNT
발급된 각 COMMIT TRANSACTION
값은 단순히 1씩 감소합니다@@TRANCOUNT
. @@TRANCOUNT
마지막으로 0으로 감소하면 전체 외부 트랜잭션이 커밋됩니다. transaction_name 데이터베이스 엔진 COMMIT TRANSACTION
무시되므로 미해결 내부 트랜잭션이 있는 경우 외부 트랜잭션의 이름을 참조하는 발급은 1씩만 감소합니다@@TRANCOUNT
.
0인 경우 @@TRANCOUNT
를 COMMIT TRANSACTION
실행하면 오류가 발생합니다. 해당하는 BEGIN TRANSACTION
값은 없습니다.
데이터 수정이 데이터베이스의 영구적인 부분으로 만들어졌기 때문에 문이 실행된 후에 COMMIT TRANSACTION
는 트랜잭션을 롤백할 수 없습니다.
데이터베이스 엔진은 문이 시작될 때 트랜잭션 수가 0인 경우에만 문에서 트랜잭션 수를 증가시킵니다.
사용 권한
public 역할의 멤버 자격이 필요합니다.
예제
이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022
또는 AdventureWorksDW2022
샘플 데이터베이스를 사용하며, 이는 Microsoft SQL Server 예시 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.
A. 트랜잭션 커밋
적용 대상: SQL Server, Azure SQL Database, Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
다음 예에서는 작업 후보를 삭제합니다.
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. 중첩된 트랜잭션 커밋
적용 대상: SQL Server 및 Azure SQL Database
다음 예에서는 테이블을 만들고 3단계로 중첩된 트랜잭션을 생성한 다음 중첩된 트랜잭션을 커밋합니다. 각 COMMIT TRANSACTION
문에는 transaction_name 매개 변수가 있지만, COMMIT TRANSACTION
및 BEGIN TRANSACTION
문 사이에는 아무 관계가 없습니다. transaction_name 매개 변수는 프로그래머가 올바른 수의 커밋이 @@TRANCOUNT
에서 0까지 감소하여 외부 트랜잭션을 커밋하도록 코딩되었는지 확인하는 데 도움이 됩니다.
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;
PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (1, 'aaa');
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (2, 'bbb');
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (3, 'ccc');
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));