[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는 오류에 대해 전적으로 사용자에게 처리를 맡기기 때문에 해당 구문으로 메시지를 표시하지 않는다면 따로 결과창에 표시가 되지 않습니다.