ROLLBACK TRANSACTION(Transact-SQL)
명시적 또는 암시적인 트랜잭션을 트랜잭션의 처음이나 트랜잭션 내의 저장점으로 롤백합니다.
구문
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
인수
transaction_name
BEGIN TRANSACTION에서 트랜잭션에 할당된 이름입니다. transaction_name은 식별자에 대한 규칙을 따라야 하지만 트랜잭션 이름의 처음 32자만 사용됩니다. 트랜잭션을 중첩할 경우transaction_name은 가장 바깥쪽 BEGIN TRANSACTION 문이어야 합니다.**@**tran_name_variable
유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다.savepoint_name
SAVE TRANSACTION 문의 savepoint_name입니다. savepoint_name은 식별자에 대한 규칙을 따라야 합니다. 조건부 롤백이 트랜잭션의 일부에만 영향을 미칠 경우 savepoint_name을 사용합니다.**@**savepoint_variable
유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다.
주의
ROLLBACK TRANSACTION은 트랜잭션의 시작 이후 또는 저장점까지의 모든 데이터 수정 사항을 지웁니다. 또한 트랜잭션에서 보유한 리소스도 해제합니다.
savepoint_name이나 transaction_name이 없는 ROLLBACK TRANSACTION은 트랜잭션의 처음으로 롤백합니다. 트랜잭션을 중첩할 경우 이 문에서는 모든 내부 트랜잭션을 가장 바깥쪽 BEGIN TRANSACTION 문으로 롤백합니다. 두 경우 모두 ROLLBACK TRANSACTION은 @@TRANCOUNT 시스템 함수를 0으로 감소시킵니다. ROLLBACK TRANSACTION savepoint_name은 @@TRANCOUNT를 감소시키지 않습니다.
savepoint_name을 지정하는 ROLLBACK TRANSACTION 문은 에스컬레이션과 변환을 제외하고 저장점을 초과하여 획득한 모든 잠금을 해제합니다. 이러한 잠금은 해제되지 않으며 이전 잠금 모드로 다시 변환되지 않습니다.
ROLLBACK TRANSACTION은 BEGIN DISTRIBUTED TRANSACTION으로 명시적으로 시작하거나 로컬 트랜잭션에서 에스컬레이션된 분산 트랜잭션의 savepoint_name을 참조할 수 없습니다.
COMMIT TRANSACTION 문을 실행한 후에는 트랜잭션을 롤백할 수 없습니다.
트랜잭션에서 중복되는 저장점 이름이 허용되지만 중복되는 저장점 이름을 사용하는 ROLLBACK TRANSACTION은 해당 저장점 이름을 사용하여 가장 최근의SAVE TRANSACTION으로만 롤백합니다.
저장 프로시저에서 savepoint_name이나 transaction_name이 없는 ROLLBACK TRANSACTION 문은 모든 문을 가장 바깥쪽 BEGIN TRANSACTION으로 롤백합니다. 저장 프로시저의 ROLLBACK TRANSACTION 문 실행 시 저장 프로시저를 호출했을 때의 @@TRANCOUT 값과 저장 프로시저가 완료될 때의 @@TRANCOUNT 값이 다른 경우 정보 메시지가 생성됩니다. 이 메시지는 후속 처리에 영향을 미치지 않습니다.
트리거에서 ROLLBACK TRANSACTION이 발생한 경우
현재 트랜잭션의 해당 지점까지 이루어진 모든 데이터 수정 사항은 트리거의 수정 사항을 포함하여 롤백합니다.
트리거에서는 ROLLBACK 문 다음에 남아있는 모든 문을 계속 실행합니다. 이 문 중에서 데이터를 수정한 경우 수정 사항은 롤백되지 않습니다. 남아있는 이 문을 실행하여 중첩 트리거가 발생하지 않습니다.
트리거를 발생시키는 문 다음의 일괄 처리에 있는 문은 실행되지 않습니다.
자동 모드일 경우에도 트리거를 입력하면 @@TRANCOUNT가 1씩 증가합니다. 시스템은 트리거를 암시적인 중첩 트랜잭션으로 처리합니다.
저장 프로시저의 ROLLBACK TRANSACTION 문은 해당 프로시저를 호출하는 일괄 처리의 다음 문에 영향을 미치지 않습니다. 일괄 처리의 다음 문이 실행됩니다. 트리거의 ROLLBACK TRANSACTION 문은 트리거를 발생시킨 문이 포함된 일괄 처리를 종료합니다. 일괄 처리의 다음 문은 실행되지 않습니다.
ROLLBACK TRANSACTION 문에서는 사용자에게 메시지를 제공하지 않습니다. 저장 프로시저나 트리거에 경고가 필요한 경우 RAISERROR 또는 PRINT 문을 사용하십시오. 오류를 표시하는 데는 RAISERROR 문을 사용하는 것이 좋습니다.
커서에 대한 ROLLBACK의 결과는 다음 3가지 규칙으로 정의합니다.
CURSOR_CLOSE_ON_COMMIT을 ON으로 설정하면 ROLLBACK에서는 모든 열려있는 커서의 할당을 취소하지 않습니다.
CURSOR_CLOSE_ON_COMMIT을 OFF로 설정하면 ROLLBACK에서는 완전히 채운 열려있는 모든 동기 STATIC이나 INSENSITIVE 커서 또는 비동기 STATIC 커서에 영향을 미치지 않습니다. 다른 유형의 열려있는 커서는 닫히지만 할당이 취소되지는 않습니다.
일괄 처리를 종료하고 내부 롤백을 생성하는 오류는 오류 문이 포함된 일괄 처리에서 선언한 모든 커서의 할당을 취소합니다. 모든 커서는 유형이나 CURSOR_CLOSE_ON_COMMIT 설정에 상관없이 할당이 취소됩니다. 여기에는 오류 일괄 처리에서 호출한 저장 프로시저에서 선언한 커서가 포함됩니다. 오류 일괄 처리 전에 일괄 처리에서 선언한 커서는 규칙 1 과 2를 따릅니다. 교착 상태 오류가 이런 유형의 오류 예입니다. 트리거에서 발생한 ROLLBACK 문도 자동으로 이런 유형의 오류를 만듭니다.
ROLLBACK TRANSACTION을 보여 주는 코드 예제는 중첩 트랜잭션을 참조하십시오.
사용 권한
public 역할의 멤버 자격이 필요합니다.
예
다음 예에서는 명명된 트랜잭션을 롤백한 결과를 보여 줍니다.
USE TempDB;
GO
CREATE TABLE ValueTable ([value] int)
GO
DECLARE @TransactionName varchar(20) = 'Transaction1';
--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable
--@TransactionName.
BEGIN TRAN @TransactionName
INSERT INTO ValueTable VALUES(1)
INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName
INSERT INTO ValueTable VALUES(3)
INSERT INTO ValueTable VALUES(4)
SELECT * FROM ValueTable
DROP TABLE ValueTable
--Results
--value
-------------
--3
--4
참고 항목