다음을 통해 공유


ROLLBACK TRANSACTION(Transact-SQL)

적용 대상: Microsoft Fabric의 SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) 웨어하우스

이 문은 명시적 또는 암시적 트랜잭션을 트랜잭션의 시작 부분이나 트랜잭션 내의 저장점으로 롤백합니다. 트랜잭션 시작 또는 저장점에서 수행한 모든 데이터 수정 내용을 지우는 데 사용할 ROLLBACK TRANSACTION 수 있습니다. 또한 트랜잭션에서 보유한 리소스도 해제합니다.

트랜잭션 롤백에는 지역 변수 또는 테이블 변수에 대한 변경 내용이 포함되지 않습니다. 이러한 변경 내용은 이 문에서 지워지지 않습니다.

Transact-SQL 구문 표기 규칙

구문

SQL Server 및 Azure SQL Database 구문

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

Microsoft Fabric, Azure Synapse Analytics 및 병렬 데이터 웨어하우스 데이터베이스의 Synapse Data Warehouse 구문입니다.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

인수

transaction_name

에서 트랜잭션에 할당된 이름입니다 BEGIN TRANSACTION. transaction_name은 식별자 규칙을 따라야 하지만, 트랜잭션 이름의 처음 32자만 사용됩니다. 트랜잭션을 중첩하는 경우 transaction_name 가장 바깥쪽 BEGIN TRANSACTION 문의 이름이어야 합니다. transaction_name SQL Server 인스턴스가 대/소문자를 구분하지 않는 경우에도 항상 대/소문자를 구분합니다.

@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 사용자에게 메시지를 생성하지 않습니다. 저장 프로시저 또는 트리거에 경고가 필요한 경우 또는 PRINT 문을 사용합니다RAISERROR. RAISERROR 는 오류를 나타내는 기본 설정 문입니다.

설명

ROLLBACK TRANSACTIONsavepoint_name 또는 transaction_name 없는 경우 트랜잭션의 시작 부분으로 롤백됩니다. 트랜잭션을 중첩할 때 이 동일한 문은 모든 내부 트랜잭션을 가장 BEGIN TRANSACTION 바깥쪽 문으로 롤백합니다. 두 경우 ROLLBACK TRANSACTION 모두 시스템 함수를 @@TRANCOUNT 0으로 줄입니다. ROLLBACK TRANSACTION <savepoint_name> 는 감소 @@TRANCOUNT하지 않습니다.

ROLLBACK TRANSACTION는 로컬 트랜잭션에서 명시적으로 BEGIN DISTRIBUTED TRANSACTION 시작되거나 에스컬레이션된 분산 트랜잭션의 savepoint_name 참조할 수 없습니다.

롤백되는 트랜잭션 내에 포함된 중첩된 트랜잭션과 연결된 경우 COMMIT TRANSACTION 를 제외하고 문이 실행된 후에 COMMIT TRANSACTION 는 트랜잭션을 롤백할 수 없습니다. 이 경우 중첩된 트랜잭션은 해당 트랜잭션을 발급 COMMIT TRANSACTION 한 경우에도 롤백됩니다.

트랜잭션 내에서 중복된 저장점 이름이 허용되지만 ROLLBACK TRANSACTION 중복된 저장점 이름을 사용하면 해당 저장점 이름을 사용하여 가장 최근의 SAVE TRANSACTION 이름으로만 롤백됩니다.

상호 운용성

저장 프로시저 ROLLBACK TRANSACTION 에서 savepoint_name 또는 transaction_name 없는 문은 모든 문을 가장 BEGIN TRANSACTION바깥쪽으로 롤백합니다. ROLLBACK TRANSACTION 저장 프로시저가 @@TRANCOUNT 호출될 때의 값과 저장 프로시저가 완료 @@TRANCOUNT 될 때 다른 값을 가지는 저장 프로시저의 문은 정보 메시지를 생성합니다. 이 메시지는 후속 처리에 영향을 주지 않습니다.

트리거에서 ROLLBACK TRANSACTION 발급되는 경우:

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

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

  • 트리거를 실행한 문 이후 일괄 처리의 문은 실행되지 않습니다.

@@TRANCOUNT 는 자동 커밋 모드인 경우에도 트리거를 입력할 때 하나씩 증가합니다. 시스템은 트리거를 암시적인 중첩 트랜잭션으로 처리합니다.

ROLLBACK TRANSACTION 저장 프로시저의 문은 프로시저를 호출한 일괄 처리의 후속 문에 영향을 주지 않습니다. 일괄 처리의 후속 문이 실행됩니다. ROLLBACK TRANSACTION 트리거의 문은 트리거를 발생시킨 문이 포함된 일괄 처리를 종료합니다. 일괄 처리의 후속 문은 실행되지 않습니다.

커서의 ROLLBACK 효과는 다음 세 가지 규칙에 의해 정의됩니다.

  • setONROLLBACK 사용하면 CURSOR_CLOSE_ON_COMMIT 닫히지만 열려 있는 모든 커서의 할당을 취소하지는 않습니다.

  • 집합을 사용하면 CURSOR_CLOSE_ON_COMMIT 완전히 채워진 열려 있는 동기 STATIC 또는 커서 또는 INSENSITIVE 비동 STATIC 기 커서에는 영향을 주지 ROLLBACK 않습니다.OFF 다른 유형의 열려있는 커서는 닫히지만 할당이 취소되지는 않습니다.

  • 일괄 처리를 종료하고 내부 롤백을 생성하는 오류는 오류 문이 포함된 일괄 처리에서 선언한 모든 커서의 할당을 취소합니다. 모든 커서는 형식이나 설정 CURSOR_CLOSE_ON_COMMIT에 관계없이 할당 취소됩니다. 여기에는 오류 일괄 처리에서 호출한 저장 프로시저에서 선언한 커서가 포함됩니다. 오류 일괄 처리 전에 일괄 처리로 선언된 커서에는 처음 두 규칙이 적용됩니다. 교착 상태 오류가 이런 유형의 오류 예입니다. ROLLBACK 트리거에서 실행된 문은 이러한 유형의 오류도 자동으로 생성합니다.

잠금 동작

ROLLBACK TRANSACTION savepoint_name 지정하는 문은 에스컬레이션 및 변환을 제외하고 저장점 이외의 잠금을 해제합니다. 이러한 잠금은 해제되지 않으며 이전 잠금 모드로 다시 변환되지 않습니다.

사용 권한

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

예제

다음 예에서는 명명된 트랜잭션을 롤백한 결과를 보여 줍니다. 테이블을 만든 후 다음 문은 명명된 트랜잭션을 시작하고, 두 개의 행을 삽입한 다음, 변수 @TransactionName에 명명된 트랜잭션을 롤백합니다. 명명된 트랜잭션 외부의 또 다른 명령문은 두 개의 행을 삽입합니다. 쿼리에서 이전 명령문의 결과를 반환합니다.

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

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

BEGIN TRANSACTION @TransactionName

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

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

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

결과 집합은 다음과 같습니다.

value
-----
3
4