본문 바로가기
㏈ª By β┖υΕJini/MS-SQL

MS-SQL2005 TRY... CATCH를 사용한 Transaction 처리

by ㏈ª ☞ β┖υΕJini.κR 2007. 10. 30.

2007년 초 처음으로  MS-SQL2005 를 이용한 프로젝트를 하게 되었다.
예전 프로시져 내에서 @@error 를 이용하여 Transaction  처리를
하였는데 2005 부터 TRY... CATCH를 이용하요 보다 쉽게 사용할수 있게
되었다. (TRY... CATCH 자바, 닷넷에서 많으 보던건데... )

MS-SQL 2005부터는 TRY/CATCH블럭을 이용한 오류처리가 가능하다.
사용법은 C#의 그것과 매우 유사하며, @@ERROR의 값으로 처리 하는
방법보다 훨씬 좋은 가독성과 성능을 낼수 있다고 한다.

BEGIN TRY
    실행할 쿼리문...
END TRY

BEGIN CATCH
    오류시 처리할 구문   
END CATCH

사용법은 사용할 쿼리문을 단순히 Begin Try / End Try로 묶고 오류시 처리할 내용을 Begin Catch / End Catch로 묶어 주기만 하면된다.

"2008/05/21 - [DataBase] - Transaction에서의 @@error 사용" 포스트에서 이야기한 내용을 2005의 Try/Catch를 이용하면 훨씬 간단하게 표현이 가능하다.

Begin Transaction
    1) Insert 실행
    IF(@@Error <> 0) GOTO _QuitTran

    2) Insert 실행
    IF(@@Error <> 0) GOTO _QuitTran

COMMIT TRAN
GOTO _SaveTran

_QuitTran:
----------------------------------------------------
IF @@TRANCOUNT > 0
BEGIN
    ROLLBACK TRAN
END
RETURN
----------------------------------------------------

_SaveTran:
----------------------------------------------------
RETURN
----------------------------------------------------
GO

기존에 이런식으로 처리했던 내용을 각각의 트랜젝션으로 묶을 부분을 골라 Try/Catch로 묶어 주기만 하면 된다.

BEGIN Transaction
    BEGIN TRY
        1) Insert 실행 --> 실패
        2) Insert 실행 --> 성공
       
Commit Transaction
    END TRY
    BEGIN CATCH
        Rollback Transaction
    END CATCH

IF(@@Error <> 0) GOTO _QuitTran의 중복적인 사용과 _SaveTran/_QuitTran등의 구문을 사용하지 않고도 고도 매우 쉽게 Transaction을 사용할 수 있다.

오류의 내용을 알고 싶을 경우 MS-SQL2005에 있는 기본 내장 함수를 이용한면 된다.
ERROR_NUMBER() < 오류번호 >
ERROR_MESSAGE() < 오류메세지 >
ERROR_STAT() < 오류상태코드 >
ERROR_SERVERITY() < 오류가 발생한 행번호 >
ERRPR_PROCEDURE() < 오류가 발생한 트리거/프로시져 >