트랜잭션 저장점

저장점은 트랜잭션의 일부를 롤백하는 메커니즘을 제공합니다. SAVE TRANSACTION savepoint_name 문을 사용하여 저장점을 만듭니다. 나중에 트랜잭션의 시작 지점으로 롤백하는 대신 저장점으로 롤백하려면 ROLLBACK TRANSACTION savepoint_name 문을 실행합니다.

저장점은 오류가 발생할 가능성이 거의 없는 경우 유용합니다. 오류가 자주 발생하지 않는 경우 업데이트 전에 각 트랜잭션을 테스트하여 업데이트가 유효한지 확인하는 것보다 저장점을 사용하여 트랜잭션의 일부를 롤백하는 것이 더 효율적입니다. 업데이트와 롤백은 비용이 많이 드는 작업이므로 저장점은 오류가 발생할 가능성이 적고 업데이트 전에 미리 유효성을 검사하는 데 비교적 비용이 많이 드는 경우에만 효과적입니다.

이 예에서는 회사에 효율적인 공급자와 다시 주문 지점이 있어 재고가 부족할 염려가 거의 없는 주문 시스템에서 저장점을 사용하는 것을 보여 줍니다. 일반적으로 응용 프로그램은 주문을 기록하는 업데이트를 수행하기 전에 현재 재고가 충분한지 확인합니다. 이 예에서는 느린 모뎀이나 WAN으로 연결하기 때문에 현재 재고 수량을 확인하는 데 비교적 비용이 많이 드는 것으로 가정합니다. 먼저 업데이트를 수행하고 재고가 충분하지 않다는 오류가 발생할 때 업데이트를 롤백하도록 응용 프로그램 코드를 작성할 수 있습니다. 이 경우 삽입 후 @@ERROR를 신속하게 확인하는 것이 업데이트 전에 수량을 확인하는 것보다 훨씬 빠릅니다.

InvCtrl 테이블에는 QtyInStk 열이 0 미만이 될 때 547 오류를 발생시키는 CHECK 제약 조건이 있습니다. OrderStock 프로시저는 저장점을 만듭니다. 547 오류가 발생하면 저장점으로 롤백되고 보유하고 있는 항목 수가 호출 프로세스로 반환됩니다. 그럼 다음 호출 프로세스가 보유하고 있는 수량에 대한 주문을 바꿉니다. OrderStock이 0을 반환하면 주문된 수량만큼의 재고가 충분히 있는 것입니다.

SET NOCOUNT OFF;
GO
USE AdventureWorks;
GO
CREATE TABLE InvCtrl
    (WhrhousID      int,
    PartNmbr      int,
    QtyInStk      int,
    ReordrPt      int,
    CONSTRAINT InvPK PRIMARY KEY
    (WhrhousID, PartNmbr),
    CONSTRAINT QtyStkCheck CHECK (QtyInStk > 0) );
GO
CREATE PROCEDURE OrderStock
    @WhrhousID int,
    @PartNmbr int,
    @OrderQty int
AS
    DECLARE @ErrorVar int;
    SAVE TRANSACTION StkOrdTrn;
    UPDATE InvCtrl SET QtyInStk = QtyInStk - @OrderQty
        WHERE WhrhousID = @WhrhousID
        AND PartNmbr = @PartNmbr;
    SELECT @ErrorVar = @@error;
    IF (@ErrorVar = 547)
    BEGIN
        ROLLBACK TRANSACTION StkOrdTrn;
        RETURN (SELECT QtyInStk
                FROM InvCtrl
                WHERE WhrhousID = @WhrhousID
                AND PartNmbr = @PartNmbr);
    END
    ELSE
        RETURN 0;
GO