본문 바로가기
Develop/MSSQL

[sql] EXECUTE 후 트랜잭션 개수는 BEGIN 및 COMMIT 문 수가 일치하지 않음을 나타냅니다. 이전 개수 = 0, 현재 개수 = 1.

by 3-stack 2021. 11. 8.

MSSQL 프로시저 실행 후 아래와 같은 에러 메시지를 마주할 때가 있다.

실행 프로시저가 BEGIN TRAN을 제대로 COMMIT 또는 ROLLBACK 되지 않았을 때 나타난다.

 

분명 아래와 같이

BEGIN TRY 로 실행 쿼리문을 잘 감 싸줬고,

BEGIN CATCH로 에러도 잘 핸들링 해줬다.

 

원인은

TRY...CATCH 에 잡히지 않는 실행문이 존재하기 때문이다.

위의 예제에서는 존재하지 않는 테이블에 INSERT 하려는 경우다.

위와 같은 상황을 방지하기 위해 SET XACT_ABORT ON 를 사용할 수 있다.

 

XACT_ABORT ON 인 경우

Transaction-SQL 문이 런타임 오류를 발생시킬 경우 해당 트랜잭션이 종료되고 ROLL BACK 된다.

구문오류와 같은 컴파일 오류는 XACT_ABORT 의 영향을 받지 않는다.

 

SET XACT_ABORT ON 을 사용한다고 해도 CATCH 로 에러를 잡을 수는 없지만

최소한 TRAN 개수가 맞지 않는다는 근본적이지 않은 로그가 아니라 아래와 같은 실질적은 로그를 얻을 수 있다.

 

🤷‍♂️ BEGIN TRAN은 어떤 오류를 못 잡는걸까?

TRY...CATCH 구문의 영향을 받지 않는 오류

  • 심각도가 10 이하 또는 20이상의 경고 또는 정보 메시지
  • 심각도가 20 이상인 오류라도 DB 연결이 끊기지 않은 경우 TRY...CATCH 구문이 오류를 처리한다.
  • 클라이언트 인터럽트 요청 또는 클라이언트 연결 끊김과 같은 주의.
  • 시스템 관리자가 KILL 문을 사용하여 세션을 종료할 때

다음 유형의 오류가 TRY...CATCH 구문과 동일한 실행 수준에서 발생하는 경우 CATCH 블록에서 처리되지 않는다.

  • 구문 오류와 같이 일괄 처리의 실행을 막는 컴파일 오류
  • 문 수준 다시 컴파일 단계에서 발생한 오류(예: 컴파일 이후에 지연된 이름 확인으로 발생한 개체 이름 확인 오류)
  • 개체 이름 확인 오류.

위의 경우는 개체이름 확인 오류라 CATCH 하지 못 했다..

 


참고
MSSQL

댓글