트랜잭션의 오류 처리

완료됨

구조적 예외 처리는 TRY/CATCH 구문을 사용하여 오류를 테스트하고 오류를 처리합니다. 트랜잭션에서 예외 처리를 사용하는 경우 TRY/CATCH 블록과 관련하여 COMMIT 또는 ROLLBACK 키워드를 올바른 위치에 배치하는 것이 중요합니다.

트랜잭션 커밋

구조적 예외 처리와 함께 트랜잭션을 사용하는 경우 다음 코드 예제와 같이 COMMIT TRANSACTION을 TRY 블록 내에 배치합니다.

BEGIN TRY
 BEGIN TRANSACTION
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION
END TRY 

트랜잭션 롤백

구조적 예외 처리와 함께 사용하는 경우 다음 코드 예제와 같이 ROLLBACK TRANSACTION을 CATCH 블록 내에 배치합니다.

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	ROLLBACK TRANSACTION;
END CATCH;

XACT_STATE

활성 트랜잭션을 롤백하지 않도록 하려면 XACT_STATE 함수를 사용합니다. XACT_STATE 다음 값을 반환합니다.

반환 값 의미
1 현재 요청에는 커밋 가능한 활성 사용자 트랜잭션이 있습니다.
0 활성 트랜잭션이 없습니다.
-1 현재 요청에 활성 사용자 트랜잭션이 있지만 트랜잭션을 커밋할 수 없는 트랜잭션으로 분류하는 오류가 발생했습니다.

rollBACK 명령 앞에 XACT_STATE 사용하여 트랜잭션이 활성 상태인지 여부를 확인할 수 있습니다.

다음 코드는 활성 사용자 트랜잭션이 있는 경우에만 트랜잭션이 롤백되도록 CATCH 블록 내에서 사용되는 XACT_STATE 함수를 보여줍니다.

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.SimpleOrders(custid, empid, orderdate) 
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.SimpleOrderDetails(orderid,productid,unitprice,qty) 
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	IF (XACT_STATE()) <> 0
    	BEGIN
        ROLLBACK TRANSACTION;
    	END;
	ELSE .... -- provide for other outcomes of XACT_STATE()
END CATCH;