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

저장 프로시저 또는 트리거에서 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가 발생하고 일괄 처리가 종료됩니다. 따라서 트리거 내에서는 @@TRANCOUNT를 0으로 다시 설정하는 ROLLBACK TRANSACTION 및 @@TRANCOUNT를 0으로 감소시키는 COMMIT TRANSACTION은 사용하지 않는 것이 좋습니다. 롤백 후 BEGIN TRANSACTION 문을 실행하면 오류 발생을 멈출 수 있지만 응용 프로그램 논리에 오류가 발생할 수 있습니다.

트리거 내에 실행된 BEGIN TRANSACTION 문이 실제로 중첩 트랜잭션을 시작한다는 것을 이해하는 것이 중요합니다. 이 경우에 COMMIT TRANSACTION 문을 실행하면 중첩 트랜잭션에만 적용됩니다. 중첩 트랜잭션을 롤백할 때는 중첩 BEGIN TRANSACTION 문이 무시되므로 트리거에서 ROLLBACK TRANSACTION을 실행하면 해당 트리거에 의해 실행된 모든 BEGIN TRANSACTION 문 이전까지 롤백됩니다. ROLLBACK은 가장 바깥쪽 트랜잭션으로 롤백하고 @@TRANCOUNT를 0으로 설정합니다.

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

  • 트리거에 의해 만들어진 것을 포함하여 해당 시점까지 현재 트랜잭션에 만들어진 모든 데이터 수정 내용이 롤백됩니다.
  • 트리거에서는 ROLLBACK 문 다음에 남아있는 모든 문을 계속 실행합니다. 이 문 중에서 데이터를 수정한 경우 수정 사항은 롤백되지 않습니다.
  • 트리거의 ROLLBACK은 트리거를 실행한 문이 포함된 일괄 처리에서 선언되고 열린 모든 커서를 닫고 할당을 취소합니다. 여기에는 트리거를 실행한 일괄 처리에서 호출한 저장 프로시저에서 선언되고 열린 커서가 포함됩니다. 트리거를 실행한 일괄 처리 이전에 실행된 일괄 처리에서 선언된 커서만 닫힙니다. 그러나 STATIC 또는 INSENSITIVE 커서는 다음과 같은 경우 열려 있게 됩니다.
    • CURSOR_CLOSE_ON_COMMIT이 OFF로 설정된 경우
    • 정적 커서가 동기화되거나 비동기 커서로 완전히 채워진 경우

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

참고 항목

개념

중첩 트랜잭션

관련 자료

@@TRANCOUNT(Transact-SQL)
ROLLBACK TRANSACTION(Transact-SQL)
ROLLBACK WORK(Transact-SQL)
SAVE TRANSACTION(Transact-SQL)

도움말 및 정보

SQL Server 2005 지원 받기