새소식

DataBase/MSSQL

[MSSQL] Try Catch 문을 사용한 트랜잭션(taransaction) 컨트롤 방법

  • -

프로시저 및 DB 작업시 현재는 잘 작동하는 프로그램이 칼럼의 추가, 데이터 타입의 변화, 그 밖의 많은 상황에서 오류가 발생하는 경우가 존재합니다. 이때 트랜잭션이 걸려있지 않은 경우 일부 데이터만 처리가 되는 매우 심각한 오류가 발생할 수 있습니다.

 

MSSQL SERVER는 이러한 상황에 대해 SQL 실행시 오류를 컨트롤 할 수 있도록 Try Catch 문을 제공하고 있습니다.

그리고 Try Catch와 Transaction처리를 통해 데이터 정합성을 보장할 수 있습니다.

 

 

사용법은 간단합니다.

BEGIN TRY

//실행할 SQL 문입력

END TRY
BEGIN CATCH

//예외 상황 발생시 처리

END CATCH

 

 

간단하게 테스트를 한번 해보겠습니다.

우선 아래의 테이블을 생성해 줍니다.

CREATE TABLE TestTran
(
    Id   INT IDENTITY(0,1),
    NAME NVARCHAR(200)
)

 

아래의 코드를 실행시

SET NOCOUNT ON

DECLARE @NUM INT 

--트랜잭션 실행
BEGIN TRAN

BEGIN TRY
 
    --데이터 삽입
    INSERT INTO TestTran(NAME)
         SELECT '옴티'
	
    --해당 구문에서 0나누기 오류 발생
    SELECT @NUM = 1/0

END TRY
BEGIN CATCH

    PRINT 'Catch 문이 실행되었습니다.'
 

    DECLARE @ERROR_MESSAGE    NVARCHAR(4000),
            @ERROR_SEVERITY   INT           ,
            @ERROR_STATE      INT           ,
            @ERROR_PROCEDURE  NVARCHAR(128)
    			                                                                                                        
    SELECT  @ERROR_MESSAGE    = ERROR_MESSAGE()  ,
            @ERROR_SEVERITY   = ERROR_SEVERITY() ,
            @ERROR_STATE      = ERROR_STATE()    ,
            @ERROR_PROCEDURE  = ERROR_PROCEDURE()

    RAISERROR (@ERROR_MESSAGE, @ERROR_SEVERITY, @ERROR_STATE, @ERROR_PROCEDURE)

	--오류 발생시 롤백 후 리턴
	ROLLBACK TRAN
    RETURN 


END CATCH

--오류가 발생하지 않았을시 COMMIT
COMMIT TRAN

GO 

--데이터 출력
SELECT * FROM TestTran

 

 

 

출력결과를 보면 TestTran 테이블에 Insert를 했음에도 불구하고 데이터가 조회되지 않는데 

이는 Catch문에서 예외상황이 발생할 시 Transaction에 대해 Rollback 처리를 했기 때문입니다.

 

 

또한 위에 Catch 문에서 사용한 이 SQL문은 Try Catch는 오류에 대해 전적으로 사용자에게 처리를 맡기기 때문에 해당 구문으로 메시지를 표시하지 않는다면 따로 결과창에 표시가 되지 않습니다.

DECLARE @ERROR_MESSAGE    NVARCHAR(4000),
            @ERROR_SEVERITY   INT           ,
            @ERROR_STATE      INT           ,
            @ERROR_PROCEDURE  NVARCHAR(128)
    			                                                                                                        
SELECT  @ERROR_MESSAGE    = ERROR_MESSAGE()  ,
        @ERROR_SEVERITY   = ERROR_SEVERITY() ,
        @ERROR_STATE      = ERROR_STATE()    ,
        @ERROR_PROCEDURE  = ERROR_PROCEDURE()

RAISERROR (@ERROR_MESSAGE, @ERROR_SEVERITY, @ERROR_STATE, @ERROR_PROCEDURE)

 

아래의 그림은 해당 오류 메시지 처리구문을 주석 처리한 후 실행한 결과입니다.

 

 

이처럼 Try Catch 문을 잘 사용한다면 어떠한 상황에서도 데이터 정합성을 보장할 수 있기 때문에 꼭 알아두도록 합시다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.