BEGIN TRANSACTION(Transact-SQL)BEGIN TRANSACTION (Transact-SQL)

THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

명시적 로컬 트랜잭션의 시작 위치를 표시합니다.Marks the starting point of an explicit, local transaction. 명시적 트랜잭션은 BEGIN TRANSACTION 문으로 시작되어 COMMIT 또는 ROLLBACK 문으로 끝납니다.Explicit transactions start with the BEGIN TRANSACTION statement and end with the COMMIT or ROLLBACK statement.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

--Applies to SQL Server and Azure SQL Database

BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Azure SQL Data Warehouse and Parallel Data Warehouse

BEGIN { TRAN | TRANSACTION }   
[ ; ]  

인수Arguments

transaction_nametransaction_name
적용 대상: SQL Server(2008부터), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

트랜잭션에 할당된 이름입니다.Is the name assigned to the transaction. transaction_name은 식별자 규칙을 따라야 하지만 32자보다 긴 식별자는 허용되지 않습니다.transaction_name must conform to the rules for identifiers, but identifiers longer than 32 characters are not allowed. 중첩된 BEGIN...COMMIT 또는 BEGIN...ROLLBACK 문의 가장 바깥쪽 쌍에서만 트랜잭션 이름을 사용합니다.Use transaction names only on the outermost pair of nested BEGIN...COMMIT or BEGIN...ROLLBACK statements. SQL ServerSQL Server 인스턴스에서 대/소문자를 구분하지 않는 경우에도 transaction_name은 항상 대/소문자를 구분합니다.transaction_name is always case sensitive, even when the instance of SQL ServerSQL Server is not case sensitive.

@tran_name_variable@tran_name_variable
적용 대상: SQL Server(2008부터), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다.Is the name of a user-defined variable containing a valid transaction name. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다.The variable must be declared with a char, varchar, nchar, or nvarchar data type. 변수에 32자보다 더 많은 문자가 전달되는 경우 처음 32자만 사용되고 나머지 문자는 잘립니다.If more than 32 characters are passed to the variable, only the first 32 characters will be used; the remaining characters will be truncated.

WITH MARK [ 'description' ]WITH MARK [ 'description' ]
적용 대상: SQL Server(2008부터), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

로그에 트랜잭션이 표시되도록 지정합니다.Specifies that the transaction is marked in the log. description은 표시를 설명하는 문자열입니다.description is a string that describes the mark. 128자보다 긴 description은 128자로 잘린 다음에 msdb.dbo.logmarkhistory 테이블에 저장됩니다.A description longer than 128 characters is truncated to 128 characters before being stored in the msdb.dbo.logmarkhistory table.

WITH MARK를 사용할 경우 트랜잭션 이름을 반드시 지정해야 합니다.If WITH MARK is used, a transaction name must be specified. WITH MARK를 사용하면 명명된 표시에 트랜잭션 로그를 복원할 수 있습니다.WITH MARK allows for restoring a transaction log to a named mark.

일반적인 주의 사항General Remarks

BEGIN TRANSACTION은 @@TRANCOUNT를 1씩 증가시킵니다.BEGIN TRANSACTION increments @@TRANCOUNT by 1.

BEGIN TRANSACTION은 연결에서 참조하는 데이터가 논리적, 물리적으로 일관성 있는 시점을 나타냅니다.BEGIN TRANSACTION represents a point at which the data referenced by a connection is logically and physically consistent. 오류가 발생할 경우 BEGIN TRANSACTION 이후에 발생한 모든 데이터 수정 사항을 롤백하여 데이터를 이러한 일관성 있는 상태로 되돌릴 수 있습니다.If errors are encountered, all data modifications made after the BEGIN TRANSACTION can be rolled back to return the data to this known state of consistency. 트랜잭션이 오류 없이 완료되고 COMMIT TRANSACTION이 실행되어 수정 사항이 데이터베이스에 영구히 반영되거나, 오류가 발생하여 ROLLBACK TRANSACTION 문이 모든 수정 사항을 지울 때까지 모든 트랜잭션은 지속됩니다.Each transaction lasts until either it completes without errors and COMMIT TRANSACTION is issued to make the modifications a permanent part of the database, or errors are encountered and all modifications are erased with a ROLLBACK TRANSACTION statement.

BEGIN TRANSACTION은 해당 문을 실행한 연결에 대해 로컬 트랜잭션을 시작합니다.BEGIN TRANSACTION starts a local transaction for the connection issuing the statement. 현재 트랜잭션 격리 수준 설정에 따라 해당 연결에서 실행한 Transact-SQLTransact-SQL 문을 지원하기 위해 획득한 리소스는 트랜잭션이 COMMIT TRANSACTION 또는 ROLLBACK TRANSACTION 문으로 완료될 때까지 잠금 상태가 됩니다.Depending on the current transaction isolation level settings, many resources acquired to support the Transact-SQLTransact-SQL statements issued by the connection are locked by the transaction until it is completed with either a COMMIT TRANSACTION or ROLLBACK TRANSACTION statement. 트랜잭션이 장기간 처리 중이면 다른 사용자가 이러한 잠긴 리소스에 액세스할 수 없고 로그가 잘리지 않을 수도 있습니다.Transactions left outstanding for long periods of time can prevent other users from accessing these locked resources, and also can prevent log truncation.

BEGIN TRANSACTION은 로컬 트랜잭션을 시작하지만 응용 프로그램에서 INSERT, UPDATE 또는 DELETE 문 실행과 같이 로그에 기록되는 동작을 수행하기 전에는 트랜잭션 로그에 기록되지 않습니다.Although BEGIN TRANSACTION starts a local transaction, it is not recorded in the transaction log until the application subsequently performs an action that must be recorded in the log, such as executing an INSERT, UPDATE, or DELETE statement. 응용 프로그램은 SELECT 문의 트랜잭션 격리 수준을 보호하기 위해 잠금을 확보하는 등의 동작을 수행하지만 수정 동작을 수행할 때까지는 로그에 아무것도 기록되지 않습니다.An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements, but nothing is recorded in the log until the application performs a modification action.

일련의 중첩된 트랜잭션에 속한 여러 트랜잭션을 트랜잭션 이름으로 명명하는 것은 트랜잭션에 큰 영향을 주지 않습니다.Naming multiple transactions in a series of nested transactions with a transaction name has little effect on the transaction. 가장 바깥쪽의 첫 번째 트랜잭션 이름만 시스템에 등록됩니다.Only the first (outermost) transaction name is registered with the system. 유효한 저장점 이름이 아닌 다른 이름으로 롤백하면 오류가 발생합니다.A rollback to any other name (other than a valid savepoint name) generates an error. 롤백 이전에 실행된 문은 오류 발생 시 실제로 롤백되지 않고None of the statements executed before the rollback is, in fact, rolled back at the time this error occurs. 외부 트랜잭션이 롤백될 경우에만 롤백됩니다.The statements are rolled back only when the outer transaction is rolled back.

문을 커밋하거나 롤백하기 전에 다음 동작을 수행하면 BEGIN TRANSACTION 문에 의해 시작된 로컬 트랜잭션이 분산 트랜잭션으로 에스컬레이션됩니다.The local transaction started by the BEGIN TRANSACTION statement is escalated to a distributed transaction if the following actions are performed before the statement is committed or rolled back:

  • 연결된 서버에서 원격 테이블을 참조하는 INSERT, DELETE 또는 UPDATE 문을 실행합니다.An INSERT, DELETE, or UPDATE statement that references a remote table on a linked server is executed. 연결된 서버에 액세스하는 데 사용되는 OLE DB 공급자가 ITransactionJoin 인터페이스를 지원하지 않으면 INSERT, UPDATE 또는 DELETE 문이 실패합니다.The INSERT, UPDATE, or DELETE statement fails if the OLE DB provider used to access the linked server does not support the ITransactionJoin interface.

  • REMOTE_PROC_TRANSACTIONS 옵션이 ON으로 설정된 경우 원격 저장 프로시저를 호출합니다.A call is made to a remote stored procedure when the REMOTE_PROC_TRANSACTIONS option is set to ON.

    SQL ServerSQL Server의 로컬 복사본은 트랜잭션 컨트롤러가 되고 MS DTC( MicrosoftMicrosoft Distributed Transaction Coordinator)를 사용하여 분산 트랜잭션을 관리합니다.The local copy of SQL ServerSQL Server becomes the transaction controller and uses MicrosoftMicrosoft Distributed Transaction Coordinator (MS DTC) to manage the distributed transaction.

    BEGIN DISTRIBUTED TRANSACTION을 사용하여 트랜잭션을 분산 트랜잭션으로 명시적으로 실행할 수 있습니다.A transaction can be explicitly executed as a distributed transaction by using BEGIN DISTRIBUTED TRANSACTION. 자세한 내용은 BEGIN DISTRIBUTED TRANSACTION(Transact-SQL)를 참조하세요.For more information, see BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

    SET IMPLICIT_TRANSACTIONS가 ON인 경우 BEGIN TRANSACTION 문을 실행하면 두 개의 중첩 트랜잭션이 만들어집니다.When SET IMPLICIT_TRANSACTIONS is set to ON, a BEGIN TRANSACTION statement creates two nested transactions. 자세한 내용은 SET IMPLICIT_TRANSACTIONS (Transact-SQL)을 참조하세요.For more information see, SET IMPLICIT_TRANSACTIONS (Transact-SQL)

표시된 트랜잭션Marked Transactions

WITH MARK 옵션을 사용하면 트랜잭션 이름이 트랜잭션 로그에 저장됩니다.The WITH MARK option causes the transaction name to be placed in the transaction log. 데이터베이스를 이전 상태로 복원할 때 날짜와 시간 대신 표시된 트랜잭션을 사용할 수 있습니다.When restoring a database to an earlier state, the marked transaction can be used in place of a date and time. 자세한 내용은 표시된 트랜잭션을 사용하여 관련 데이터베이스를 일관되게 복구(전체 복구 모델)RESTORE (Transact-SQL)을 참조하세요.For more information, see Use Marked Transactions to Recover Related Databases Consistently (Full Recovery Model) and RESTORE (Transact-SQL).

또한 트랜잭션은 로그 표시는 관련 데이터베이스 집합을 논리적으로 일관성 있는 상태로 복구해야 하는 경우에 필요합니다.Additionally, transaction log marks are necessary if you need to recover a set of related databases to a logically consistent state. 표시는 분산 데이터베이스에 의해 관련 데이터베이스의 트랜잭션 로그에 저장될 수 있습니다.Marks can be placed in the transaction logs of the related databases by a distributed transaction. 이러한 표시에 관련 데이터베이스 집합을 복구하는 경우 트랜잭션이 일관된 데이터베이스 집합이 만들어집니다.Recovering the set of related databases to these marks results in a set of databases that are transactionally consistent. 관련 데이터베이스에서 표시의 위치를 정하는 데는 특별한 절차가 필요합니다.Placement of marks in related databases requires special procedures.

데이터베이스가 표시된 트랜잭션에 의해 업데이트되는 경우에만 표시가 트랜잭션 로그에 저장됩니다.The mark is placed in the transaction log only if the database is updated by the marked transaction. 데이터를 수정하지 않는 트랜잭션은 표시되지 않습니다.Transactions that do not modify data are not marked.

BEGIN TRAN new_name WITH MARK는 표시되지 않은 기존 트랜잭션 내에 중첩될 수 있습니다.BEGIN TRAN new_name WITH MARK can be nested within an already existing transaction that is not marked. 그럴 경우 트랜잭션에 이름이 이미 지정되어 있더라도 new_name이 트랜잭션의 표시 이름이 됩니다.Upon doing so, new_name becomes the mark name for the transaction, despite the name that the transaction may already have been given. 다음 예에서 표시의 이름은 M2입니다.In the following example, M2 is the name of the mark.

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

트랜잭션을 중첩할 때 이미 표시된 트랜잭션을 표시하려고 하면 오류 메시지가 아닌 경고 메시지가 표시됩니다.When nesting transactions, trying to mark a transaction that is already marked results in a warning (not error) message:

"BEGIN TRAN T1 WITH MARK ...;""BEGIN TRAN T1 WITH MARK ...;"

"UPDATE table1 ...;""UPDATE table1 ...;"

"BEGIN TRAN M2 WITH MARK ...;""BEGIN TRAN M2 WITH MARK ...;"

"Server: Msg 3920, Level 16, State 1, Line 3""Server: Msg 3920, Level 16, State 1, Line 3"

"WITH MARK 옵션은 첫 번째 BEGIN TRAN WITH MARK 문에만 적용되므로"WITH MARK option only applies to the first BEGIN TRAN WITH MARK."

무시됩니다.""The option is ignored."

PermissionsPermissions

public 역할의 멤버 자격이 필요합니다.Requires membership in the public role.

Examples

1.A. 명시적 트랜잭션 사용Using an explicit transaction

적용 대상: SQL Server(2008 이상), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

이 예제에서는 AdventureWorks를 사용합니다.This example uses AdventureWorks.

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

2.B. 트랜잭션 롤백Rolling back a transaction

적용 대상: SQL Server(2008 이상), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

다음 예제에서는 트랜잭션 롤백의 결과를 보여 줍니다.The following example shows the effect of rolling back a transaction. 이 예제에서는 ROLLBACK 문이 INSERT 문을 롤백하지만 만들어진 테이블은 그대로 있습니다.In this example, the ROLLBACK statement will roll back the INSERT statement, but the created table will still exist.


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

3.C. 트랜잭션 이름 지정Naming a transaction

적용 대상: SQL Server(2008부터), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

다음 예에서는 트랜잭션의 이름을 지정하는 방법을 보여 줍니다.The following example shows how to name a transaction.

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

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

COMMIT TRANSACTION @TranName;  
GO  

4.D. 트랜잭션 표시Marking a transaction

적용 대상: SQL Server(2008부터), Azure SQL DatabaseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

다음 예에서는 트랜잭션을 표시하는 방법을 보여 줍니다.The following example shows how to mark a transaction. CandidateDelete 트랜잭션이 표시됩니다.The transaction CandidateDelete is marked.

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

참고 항목See Also

BEGIN DISTRIBUTED TRANSACTION(Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION(Transact-SQL) COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL) COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION(Transact-SQL) ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL) ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION(Transact-SQL)SAVE TRANSACTION (Transact-SQL)