저장 프로시저 및 트리거 내의 롤백 및 커밋

저장 프로시저 또는 트리거에서 ROLLBACK TRANSACTION 또는 COMMIT TRANSACTION Transact-SQL 문을 실행할 수 있지만 이 경우 오류가 발생할 수도 있습니다.

저장 프로시저의 경우

저장 프로시저가 끝날 때의 @@TRANCOUNT 값이 프로시저가 실행될 때의 값과 다르면 알림 오류 266이 발생합니다. 이 오류는 다음과 같이 두 가지로 나타날 수 있습니다.

  • 1 이상의 @@TRANCOUNT로 저장 프로시저를 호출하고 저장 프로시저에서 ROLLBACK TRANSACTION 문을 실행합니다. 저장 프로시저가 완료되면 @@TRANCOUNT가 0으로 감소하고 오류 266이 발생합니다.

  • 1 이상의 @@TRANCOUNT로 저장 프로시저를 호출하고 저장 프로시저에서 COMMIT TRANSACTION 문을 실행합니다. 저장 프로시저가 완료되면 @@TRANCOUNT가 1씩 감소하고 오류 266이 발생합니다. 그러나 COMMIT TRANSACTION 다음에 BEGIN TRANSACTION이 실행되면 오류가 발생하지 않습니다.

트리거의 경우

트리거는 트리거가 실행될 때 보류 중인 트랜잭션이 여전히 그대로라는 것을 전제로 작동합니다. 이는 트리거를 시작한 문이 암시적 트랜잭션이거나 명시적 트랜잭션일 경우에도 해당됩니다.

문이 자동 커밋 모드에서 실행되기 시작하면 오류가 발생한 경우 암시적 BEGIN TRANSACTION은 문에 의해 수정된 모든 내용이 복구되도록 허용합니다. 이 암시적 트랜잭션은 문이 완료될 때 커밋되거나 롤백되므로 일괄 처리의 다른 문에는 영향을 주지 않습니다. 그러나 트리거가 호출될 때는 이 암시적 트랜잭션이 계속 적용됩니다.

트리거를 실행하면 명시적 트랜잭션이 시작됩니다. 트리거 실행이 완료되고 @@TRANCOUNT = 0이면 오류 3609가 발생하고 일괄 처리가 종료됩니다. BEGIN TRANSACTION 문이 트리거 내에서 실행되는 경우 중첩 트랜잭션을 만듭니다. 이 경우에 COMMIT TRANSACTION 문을 실행하면 해당 문이 중첩 트랜잭션에만 적용됩니다.

트리거 내에서 ROLLBACK TRANSACTION을 사용할 경우 다음과 같은 동작에 주의하십시오.

  • 트리거에 의해 만들어진 것을 포함하여 해당 시점까지 현재 트랜잭션에 만들어진 모든 데이터 수정 내용이 롤백됩니다.

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

  • 트리거의 ROLLBACK은 트리거를 실행한 문이 포함된 일괄 처리에서 선언되고 열린 모든 커서를 닫고 할당을 취소합니다. 여기에는 트리거를 실행한 일괄 처리에서 호출한 저장 프로시저에서 선언되고 열린 커서가 포함됩니다. 트리거를 실행한 일괄 처리 이전에 실행된 일괄 처리에서 선언된 커서만 닫힙니다. 그러나 STATIC 또는 INSENSITIVE 커서는 다음과 같은 경우 열려 있게 됩니다.

    • CURSOR_CLOSE_ON_COMMIT이 OFF로 설정된 경우

    • 정적 커서가 동기화되거나 비동기 커서로 완전히 채워진 경우

ROLLBACK TRANSACTION을 사용하는 대신 SAVE TRANSACTION 문을 사용하여 트리거 내에서 부분 롤백을 실행할 수 있습니다.