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
'Develop > MSSQL' 카테고리의 다른 글
[sql] Stream Aggregate 언제? 왜? (실행계획, aggregate, hash match) (0) | 2021.11.16 |
---|---|
[sql] 모든 제약조건 제거 모든 테이블 제거 쿼리 (0) | 2021.11.11 |
[sql] cross apply 사용법 뭐지 어떻게 쓰지 (0) | 2021.10.25 |
[mssql] 조회 순번 & 페이징 쿼리 (0) | 2021.10.07 |
[mssql] cheet sheat (0) | 2021.10.01 |
댓글