본문 바로가기
개발언어/SQL

ROLLBACK TRANSACTION

by 엔돌슨 2008. 1. 8.
반응형

ROLLBACK TRANSACTION

명시적 또는 암시적인 트랜잭션을 트랜잭션의 처음이나 트랜잭션 내의 저장점으로 롤백합니다.

구문

ROLLBACK [ TRAN [ SACTION ]
     [ 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으로 롤백합니다. 저장 프로시저를 호출한 경우의 @@TRANCOUT 값과는 다른 값을 트리거를 완료한 경우 @@TRANCOUNT에 제공하는 저장 프로시저의 ROLLBACK TRANSACTION 문에서는 알림 메시지를 생성합니다. 이 메시지는 후속 처리에 영향을 미치지 않습니다.

트리거에서 ROLLBACK TRANSACTION이 발생한 경우

  • 현재 트랜잭션의 해당 지점까지 이루어진 모든 데이터 수정 사항은 트리거의 수정 사항을 포함하여 롤백합니다.

  • 트리거에서는 ROLLBACK 문 다음에 남아있는 모든 명령문을 계속 실행합니다. 이 명령문 중에서 데이터를 수정한 경우 수정 사항은 롤백되지 않습니다. 남아있는 이 명령문을 실행하여 중첩 트리거가 발생하지 않습니다.

  • 트리거를 발생시키는 명령문 다음의 일괄 처리에 있는 명령문은 실행되지 않습니다.

자동 모드일 경우에도 트리거를 입력하면 하나씩 @@TRANCOUNT가 증가합니다. (시스템에서는 트리거를 내재된 중첩 트랜잭션으로 처리합니다.)

저장 프로시저의 ROLLBACK TRANSACTION 문은 해당 프로시저를 호출하는 일괄 처리의 다음 명령문에 영향을 미치지 않습니다. 일괄 처리의 다음 명령문이 실행됩니다. 트리거의 ROLLBACK TRANSACTION 문은 트리거를 발생시킨 명령문이 포함된 일괄 처리를 종료합니다. 일괄 처리의 다음 명령문은 실행되지 않습니다.

ROLLBACK TRANSACTION 문에서는 사용자에게 메시지를 제공하지 않습니다. 저장 프로시저나 트리거에 경고가 필요한 경우 RAISERROR 또는 PRINT 문을 사용합니다. 오류를 표시하는 데는 RAISERROR 문을 더 선호합니다.

커서에 대한 ROLLBACK의 결과는 다음 세 가지 규칙으로 정의합니다.

  1. CURSOR_CLOSE_ON_COMMIT을 ON으로 설정하면 ROLLBACK에서는 모든 열려있는 커서의 할당을 취소하지 않습니다.

  2. CURSOR_CLOSE_ON_COMMIT을 OFF로 설정하면 ROLLBACK에서는 완전히 채운 열려있는 모든 동기 STATIC이나 INSENSITIVE 커서 또는 비동기 STATIC 커서에 영향을 미치지 않습니다. 다른 유형의 열려있는 커서는 닫히지만 할당이 취소되지는 않습니다.

  3. 일괄 처리를 종료하고 내부 롤백을 생성하는 오류는 오류 명령문이 포함된 일괄 처리에서 선언한 모든 커서의 할당을 취소합니다. 모든 커서는 유형이나 CURSOR_CLOSE_ON_COMMIT 설정에 상관없이 할당이 취소됩니다. 여기에는 오류 일괄 처리에서 호출한 저장 프로시저에서 선언한 커서가 포함됩니다. 오류 일괄 처리 전에 일괄 처리에서 선언한 커서는 규칙 1과2 를 따릅니다. 교착 상태 오류가 이런 유형의 오류 예입니다. 트리거에서 발생한 ROLLBACK 명령문도 자동으로 이런 유형의 오류를 만듭니다.
사용 권한

ROLLBACK TRANSACTION 권한은 기본적으로 모든 유효한 사용자에게 부여됩니다.