ROLLBACK TRANSACTION(Transact-SQL)ROLLBACK TRANSACTION (Transact-SQL)

이 항목은 다음에 적용됩니다.예SQL Server(2008부터 시작)예Azure SQL Database예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

명시적 또는 암시적인 트랜잭션을 트랜잭션의 처음이나 트랜잭션 내의 저장점으로 롤백합니다.Rolls back an explicit or implicit transaction to the beginning of the transaction, or to a savepoint inside the transaction. ROLLBACK TRANSACTION을 사용하여 트랜잭션의 시작 이후 또는 저장점까지의 모든 데이터 수정 사항을 지울 수 있습니다.You can use ROLLBACK TRANSACTION to erase all data modifications made from the start of the transaction or to a savepoint. 또한 트랜잭션에서 보유한 리소스도 해제합니다.It also frees resources held by the transaction.

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

구문Syntax

ROLLBACK { TRAN | TRANSACTION }   
     [ transaction_name | @tran_name_variable  
     | savepoint_name | @savepoint_variable ]   
[ ; ]  

인수Arguments

transaction_nametransaction_name
BEGIN TRANSACTION에서 트랜잭션에 할당된 이름입니다.Is the name assigned to the transaction on BEGIN TRANSACTION. transaction_name은 식별자 규칙을 따라야 하지만, 트랜잭션 이름의 처음 32자만 사용됩니다.transaction_name must conform to the rules for identifiers, but only the first 32 characters of the transaction name are used. 트랜잭션을 중첩하는 경우 transaction_name은 가장 바깥쪽 BEGIN TRANSACTION 문의 이름이어야 합니다.When nesting transactions, transaction_name must be the name from the outermost BEGIN TRANSACTION statement. 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
유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다.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.

savepoint_namesavepoint_name
SAVE TRANSACTION 문의 savepoint_name입니다.Is savepoint_name from a SAVE TRANSACTION statement. savepoint_name은 식별자 규칙을 따라야 합니다.savepoint_name must conform to the rules for identifiers. 조건부 롤백이 트랜잭션의 일부에만 영향을 주는 경우 savepoint_name을 사용합니다.Use savepoint_name when a conditional rollback should affect only part of the transaction.

@ savepoint_variable@ savepoint_variable
유효한 저장점 이름이 포함된 사용자 정의 변수의 이름입니다.Is name of a user-defined variable containing a valid savepoint name. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다.The variable must be declared with a char, varchar, nchar, or nvarchar data type.

오류 처리Error Handling

ROLLBACK TRANSACTION 문에서는 사용자에게 메시지를 제공하지 않습니다.A ROLLBACK TRANSACTION statement does not produce any messages to the user. 저장 프로시저나 트리거에 경고가 필요한 경우 RAISERROR 또는 PRINT 문을 사용하세요.If warnings are needed in stored procedures or triggers, use the RAISERROR or PRINT statements. 오류를 표시하는 데는 RAISERROR 문을 사용하는 것이 좋습니다.RAISERROR is the preferred statement for indicating errors.

일반적인 주의 사항General Remarks

savepoint_name 또는 transaction_name이 없는 ROLLBACK TRANSACTION은 트랜잭션의 시작 부분으로 롤백합니다.ROLLBACK TRANSACTION without a savepoint_name or transaction_name rolls back to the beginning of the transaction. 트랜잭션을 중첩할 경우 이 문에서는 모든 내부 트랜잭션을 가장 바깥쪽 BEGIN TRANSACTION 문으로 롤백합니다.When nesting transactions, this same statement rolls back all inner transactions to the outermost BEGIN TRANSACTION statement. 두 경우 모두에서 ROLLBACK TRANSACTION은 @@TRANCOUNT 시스템 함수를 0으로 감소시킵니다.In both cases, ROLLBACK TRANSACTION decrements the @@TRANCOUNT system function to 0. ROLLBACK TRANSACTION savepoint_name은 @@TRANCOUNT를 감소시키지 않습니다.ROLLBACK TRANSACTION savepoint_name does not decrement @@TRANCOUNT.

ROLLBACK TRANSACTION은 BEGIN DISTRIBUTED TRANSACTION으로 명시적으로 시작되거나 로컬 트랜잭션에서 에스컬레이션된 분산 트랜잭션에서 savepoint_name을 참조할 수 없습니다.ROLLBACK TRANSACTION cannot reference a savepoint_name in distributed transactions started either explicitly with BEGIN DISTRIBUTED TRANSACTION or escalated from a local transaction.

COMMIT TRANSACTION 문이 실행된 후에는 트랜잭션을 롤백할 수 없습니다. 단, COMMIT TRANSACTION이 롤백되는 트랜잭션 내에 포함된 중첩된 트랜잭션과 연결되어 있는 경우는 제외됩니다.A transaction cannot be rolled back after a COMMIT TRANSACTION statement is executed, except when the COMMIT TRANSACTION is associated with a nested transaction that is contained within the transaction being rolled back. 이 경우 중첩된 트랜잭션에 대해 COMMIT TRANSACTION을 실행한 경우에도 해당 트랜잭션이 롤백됩니다.In this instance, the nested transaction will is rolled back, even if you have issued a COMMIT TRANSACTION for it.

트랜잭션에서 중복되는 저장점 이름이 허용되지만 중복되는 저장점 이름을 사용하는 ROLLBACK TRANSACTION은 해당 저장점 이름을 사용하여 가장 최근의 SAVE TRANSACTION으로만 롤백합니다.Within a transaction, duplicate savepoint names are allowed, but a ROLLBACK TRANSACTION using the duplicate savepoint name rolls back only to the most recent SAVE TRANSACTION using that savepoint name.

상호 운용성Interoperability

저장 프로시저에서 savepoint_name 또는 transaction_name이 없는 ROLLBACK TRANSACTION 문은 모든 문을 가장 바깥쪽 BEGIN TRANSACTION으로 롤백합니다.In stored procedures, ROLLBACK TRANSACTION statements without a savepoint_name or transaction_name roll back all statements to the outermost BEGIN TRANSACTION. 저장 프로시저 호출 시의 @@TRANCOUNT 값이 아니라 저장 프로시저 완료 시의 @@TRANCOUNT 값을 사용하도록 하는 저장 프로시저의 ROLLBACK TRANSACTION 문은 정보 메시지를 생성합니다.A ROLLBACK TRANSACTION statement in a stored procedure that causes @@TRANCOUNT to have a different value when the stored procedure completes than the @@TRANCOUNT value when the stored procedure was called produces an informational message. 이 메시지는 후속 처리에 영향을 미치지 않습니다.This message does not affect subsequent processing.

트리거에서 ROLLBACK TRANSACTION이 발생한 경우If a ROLLBACK TRANSACTION is issued in a trigger:

  • 현재 트랜잭션의 해당 지점까지 이루어진 모든 데이터 수정 사항은 트리거의 수정 사항을 포함하여 롤백합니다.All data modifications made to that point in the current transaction are rolled back, including any made by the trigger.

  • 트리거에서는 ROLLBACK 문 다음에 남아있는 모든 문을 계속 실행합니다.The trigger continues executing any remaining statements after the ROLLBACK statement. 이 문 중에서 데이터를 수정한 경우 수정 사항은 롤백되지 않습니다.If any of these statements modify data, the modifications are not rolled back. 남아있는 이 문을 실행하여 중첩 트리거가 발생하지 않습니다.No nested triggers are fired by the execution of these remaining statements.

  • 트리거를 발생시키는 문 다음의 일괄 처리에 있는 문은 실행되지 않습니다.The statements in the batch after the statement that fired the trigger are not executed.

자동 커밋 모드인 경우에도 트리거를 입력하면 @@TRANCOUNT가 1씩 증가합니다.@@TRANCOUNT is incremented by one when entering a trigger, even when in autocommit mode. 시스템은 트리거를 암시적인 중첩 트랜잭션으로 처리합니다.(The system treats a trigger as an implied nested transaction.)

저장 프로시저의 ROLLBACK TRANSACTION 문은 해당 프로시저를 호출하는 일괄 처리의 다음 문에 영향을 미치지 않습니다. 일괄 처리의 다음 문이 실행됩니다.ROLLBACK TRANSACTION statements in stored procedures do not affect subsequent statements in the batch that called the procedure; subsequent statements in the batch are executed. 트리거의 ROLLBACK TRANSACTION 문은 트리거를 발생시킨 문이 포함된 일괄 처리를 종료합니다. 일괄 처리의 다음 문은 실행되지 않습니다.ROLLBACK TRANSACTION statements in triggers terminate the batch containing the statement that fired the trigger; subsequent statements in the batch are not executed.

커서에 대한 ROLLBACK의 결과는 다음 3가지 규칙으로 정의합니다.The effect of a ROLLBACK on cursors is defined by these three rules:

  1. CURSOR_CLOSE_ON_COMMIT을 ON으로 설정하면 ROLLBACK에서는 모든 열려있는 커서의 할당을 취소하지 않습니다.With CURSOR_CLOSE_ON_COMMIT set ON, ROLLBACK closes, but does not deallocate all open cursors.

  2. CURSOR_CLOSE_ON_COMMIT을 OFF로 설정하면 ROLLBACK에서는 완전히 채운 열려있는 모든 동기 STATIC이나 INSENSITIVE 커서 또는 비동기 STATIC 커서에 영향을 미치지 않습니다.With CURSOR_CLOSE_ON_COMMIT set OFF, ROLLBACK does not affect any open synchronous STATIC or INSENSITIVE cursors or asynchronous STATIC cursors that have been fully populated. 다른 유형의 열려있는 커서는 닫히지만 할당이 취소되지는 않습니다.Open cursors of any other type are closed but not deallocated.

  3. 일괄 처리를 종료하고 내부 롤백을 생성하는 오류는 오류 문이 포함된 일괄 처리에서 선언한 모든 커서의 할당을 취소합니다.An error that terminates a batch and generates an internal rollback deallocates all cursors that were declared in the batch containing the error statement. 모든 커서는 유형이나 CURSOR_CLOSE_ON_COMMIT 설정에 상관없이 할당이 취소됩니다.All cursors are deallocated regardless of their type or the setting of CURSOR_CLOSE_ON_COMMIT. 여기에는 오류 일괄 처리에서 호출한 저장 프로시저에서 선언한 커서가 포함됩니다.This includes cursors declared in stored procedures called by the error batch. 오류 일괄 처리 전에 일괄 처리에서 선언한 커서는 규칙 1 과 2를 따릅니다.Cursors declared in a batch before the error batch are subject to rules 1 and 2. 교착 상태 오류가 이런 유형의 오류 예입니다.A deadlock error is an example of this type of error. 트리거에서 발생한 ROLLBACK 문도 자동으로 이런 유형의 오류를 만듭니다.A ROLLBACK statement issued in a trigger also automatically generates this type of error.

잠금 동작Locking Behavior

savepoint_name을 지정하는 ROLLBACK TRANSACTION 문은 에스컬레이션과 변환을 제외하고는 저장점을 초과하여 획득한 모든 잠금을 해제합니다.A ROLLBACK TRANSACTION statement specifying a savepoint_name releases any locks that are acquired beyond the savepoint, with the exception of escalations and conversions. 이러한 잠금은 해제되지 않으며 이전 잠금 모드로 다시 변환되지 않습니다.These locks are not released, and they are not converted back to their previous lock mode.

사용 권한Permissions

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

Examples

다음 예에서는 명명된 트랜잭션을 롤백한 결과를 보여 줍니다.The following example shows the effect of rolling back a named transaction. 테이블이 만들어지면 다음 명령문은 명명된 트랜잭션을 시작하고, 두 개의 행을 삽입한 다음, @TransactionName 변수에 명명된 트랜잭션을 롤백합니다.After creating a table, the following statements start a named transaction, insert two rows, and then roll back the transaction named in the variable @TransactionName. 명명된 트랜잭션 외부의 또 다른 명령문은 두 개의 행을 삽입합니다.Another statement outside of the named transaction inserts two rows. 쿼리에서 이전 명령문의 결과를 반환합니다.The query returns the results of the previous statements.

USE tempdb;  
GO  
CREATE TABLE ValueTable ([value] int);  
GO  

DECLARE @TransactionName varchar(20) = 'Transaction1';  

BEGIN TRAN @TransactionName  
       INSERT INTO ValueTable VALUES(1), (2);  
ROLLBACK TRAN @TransactionName;  

INSERT INTO ValueTable VALUES(3),(4);  

SELECT [value] FROM ValueTable;  

DROP TABLE ValueTable;  

결과 집합은 다음과 같습니다.Here is the result set.

value  
-----   
3    
4  

참고 항목See Also

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