다음을 통해 공유


BEGIN TRANSACTION(Transact-SQL)

적용 대상:SQL ServerAzure SQL 데이터베이스Azure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)Microsoft Fabric 내 Warehouse

명시적 로컬 트랜잭션의 시작 위치를 표시합니다. 명시적 트랜잭션은 문으로 BEGIN TRANSACTION 시작하고 or ROLLBACK 문으로 COMMIT 끝납니다.

Transact-SQL 구문 표기 규칙

구문

SQL Server, Azure SQL Database 및 Azure SQL Managed Instance에 대한 구문입니다.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Microsoft Fabric, Azure Synapse Analytics 및 Analytics Platform System(PDW)의 Synapse Data Warehouse 구문입니다.

BEGIN { TRAN | TRANSACTION }
[ ; ]

참고 항목

SQL Server 2014(12.x) 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.

인수

transaction_name

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database 및 Azure SQL Managed Instance

트랜잭션에 할당된 이름입니다. transaction_name 식별자에 대한 규칙을 준수해야 하지만 32자보다 긴 식별자는 허용되지 않습니다. 가장 바깥쪽 쌍의 중첩 BEGIN...COMMIT 또는 BEGIN...ROLLBACK 문에서만 트랜잭션 이름을 사용합니다. transaction_name SQL Server 인스턴스가 대/소문자를 구분하지 않는 경우에도 항상 대/소문자를 구분합니다.

@tran_name_variable

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database 및 Azure SQL Managed Instance

유효한 트랜잭션 이름을 포함하는 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다. 변수에 32자 이상이 전달되면 처음 32자만 사용됩니다. 나머지 문자는 잘립니다.

WITH MARK [ 'description' ]

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database 및 Azure SQL Managed Instance

로그에 트랜잭션이 표시되도록 지정합니다. description은 표시를 설명하는 문자열입니다. 128자보다 긴 설명은 테이블에 저장 msdb.dbo.logmarkhistory 되기 전에 128자로 잘립니다.

사용되는 경우 WITH MARK 트랜잭션 이름을 지정해야 합니다. WITH MARK 을 사용하면 트랜잭션 로그를 명명된 표시로 복원할 수 있습니다.

설명

BEGIN TRANSACTION 을 증분합니다 @@TRANCOUNT1.

BEGIN TRANSACTION 는 연결에서 참조하는 데이터가 논리적으로나 물리적으로 일관된 지점을 나타냅니다. 오류가 발생하면 이후에 수행 BEGIN TRANSACTION 된 모든 데이터 수정 내용을 롤백하여 알려진 일관성 상태로 데이터를 반환할 수 있습니다. 각 트랜잭션은 오류 없이 완료되고 COMMIT TRANSACTION 수정을 데이터베이스의 영구적인 부분으로 만들기 위해 실행되거나 오류가 발생하고 문으로 ROLLBACK TRANSACTION 모든 수정 내용이 지워질 때까지 지속됩니다.

BEGIN TRANSACTION 는 문을 실행하는 연결에 대한 로컬 트랜잭션을 시작합니다. 현재 트랜잭션 격리 수준 설정에 따라 연결에서 발급한 Transact-SQL 문을 지원하기 위해 획득한 많은 리소스는 트랜잭션이 a 또는 ROLLBACK TRANSACTION 문으로 COMMIT TRANSACTION 완료될 때까지 트랜잭션에 의해 잠깁니다. 트랜잭션이 장기간 처리 중이면 다른 사용자가 이러한 잠긴 리소스에 액세스할 수 없고 로그가 잘리지 않을 수도 있습니다.

로컬 트랜잭션을 시작하지만 BEGIN TRANSACTION 애플리케이션이 로그에 기록되어야 하는 작업(예: 문 실행)을 수행할 때까지 트랜잭션 로그에 INSERTUPDATEDELETE 기록되지 않습니다. 애플리케이션은 문의 트랜잭션 격리 수준을 SELECT 보호하기 위해 잠금을 획득하는 등의 작업을 수행할 수 있지만 애플리케이션이 수정 작업을 수행할 때까지는 로그에 기록되지 않습니다.

일련의 중첩된 트랜잭션에 속한 여러 트랜잭션을 트랜잭션 이름으로 명명하는 것은 트랜잭션에 큰 영향을 주지 않습니다. 가장 바깥쪽의 첫 번째 트랜잭션 이름만 시스템에 등록됩니다. 유효한 저장점 이름이 아닌 다른 이름으로 롤백하면 오류가 발생합니다. 롤백 이전에 실행된 문은 오류 발생 시 실제로 롤백되지 않고 외부 트랜잭션이 롤백될 경우에만 롤백됩니다.

문이 커밋되거나 롤백되기 전에 다음 작업이 수행되면 문에서 시작한 BEGIN TRANSACTION 로컬 트랜잭션이 분산 트랜잭션으로 에스컬레이션됩니다.

  • 연결된 서버에서 INSERT원격 테이블을 참조하는 문 DELETE또는 UPDATE 명령문이 실행됩니다. INSERT연결된 서버에 액세스하는 데 사용되는 OLE DB 공급자가 인터페이스를 지원하지 ITransactionJoin 않으면 , UPDATE또는 DELETE 문이 실패합니다.

  • 옵션이 로 설정된 ON경우 원격 저장 프로시저에 REMOTE_PROC_TRANSACTIONS 대한 호출이 이루어집니다.

SQL Server의 로컬 복사본은 트랜잭션 컨트롤러가 되고 MS DTC(Microsoft Distributed Transaction Coordinator)를 사용하여 분산 트랜잭션을 관리합니다.

를 사용하여 BEGIN DISTRIBUTED TRANSACTION트랜잭션을 분산 트랜잭션으로 명시적으로 실행할 수 있습니다. 자세한 내용은 BEGIN DISTRIBUTED TRANSACTION을 참조하세요.

이 값으로 ON설정되면 SET IMPLICIT_TRANSACTIONS 문은 BEGIN TRANSACTION 두 개의 중첩된 트랜잭션을 만듭니다. 자세한 내용은 SET IMPLICIT_TRANSACTIONS를 참조하세요.

표시된 트랜잭션

WITH MARK 옵션을 사용하면 트랜잭션 이름이 트랜잭션 로그에 배치됩니다. 데이터베이스를 이전 상태로 복원하는 경우 날짜 및 시간 대신 표시된 트랜잭션을 사용할 수 있습니다. 자세한 내용은 표시된 트랜잭션을 사용하여 관련 데이터베이스를 일관되게 복구하고 RESTORE 문을 참조하세요.

또한 트랜잭션은 로그 표시는 관련 데이터베이스 집합을 논리적으로 일관성 있는 상태로 복구해야 하는 경우에 필요합니다. 표시는 분산 데이터베이스에 의해 관련 데이터베이스의 트랜잭션 로그에 저장될 수 있습니다. 이러한 표시에 관련 데이터베이스 집합을 복구하는 경우 트랜잭션이 일관된 데이터베이스 집합이 만들어집니다. 관련 데이터베이스에서 표시의 위치를 정하는 데는 특별한 절차가 필요합니다.

데이터베이스가 표시된 트랜잭션에 의해 업데이트되는 경우에만 표시가 트랜잭션 로그에 저장됩니다. 데이터를 수정하지 않는 트랜잭션은 표시되지 않습니다.

BEGIN TRANSACTION <new_name> WITH MARK 은 표시되지 않은 기존 트랜잭션 내에 중첩될 수 있습니다. 이렇게 <new_name> 하면 트랜잭션이 이미 지정되었을 수 있는 이름에도 불구하고 트랜잭션의 표시 이름이 됩니다. 다음 예에서 표시의 이름은 M2입니다.

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

트랜잭션을 중첩할 때 이미 표시된 트랜잭션을 표시하려고 하면 다음 경고 메시지가 표시됩니다.

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.

사용 권한

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

예제

이 문서의 Transact-SQL 코드 샘플은 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 데이터베이스 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용합니다AdventureWorks2022.

A. 명시적 트랜잭션 사용

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, 분석 플랫폼 시스템(PDW)

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT;

B. 트랜잭션 롤백

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, 분석 플랫폼 시스템(PDW)

다음 예제에서는 트랜잭션 롤백의 결과를 보여 줍니다. 이 예제에서 문은 ROLLBACK 문을 롤백 INSERT 하지만 생성된 테이블은 여전히 존재합니다.

CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
    INSERT INTO ValueTable VALUES(1);
    INSERT INTO ValueTable VALUES(2);
ROLLBACK;

C. 트랜잭션 이름 지정

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database, Azure SQL Managed Instance

다음 예에서는 트랜잭션의 이름을 지정하는 방법을 보여 줍니다.

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

D. 트랜잭션 표시

적용 대상: SQL Server 2008(10.0.x) 이상 버전, Azure SQL Database, Azure SQL Managed Instance

다음 예에서는 트랜잭션을 표시하는 방법을 보여 줍니다. CandidateDelete 트랜잭션이 표시됩니다.

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO