Udostępnij przez


Transaction Savepoints

Savepoints oferują mechanizm wycofać części transakcji.Tworzenie punkt bezpieczny, przy użyciu transakcji SAVE savepoint_name Instrukcja. Później wykonać transakcji ROLLBACK savepoint_name Instrukcja wycofać do punkt bezpieczny zamiast powrót do początku transakcji.

Savepoints są przydatne w sytuacjach, w których są mało prawdopodobne błędy.Korzystanie z punkt bezpieczny w celu wycofać część transakcji przypadek wystąpienia błędu rzadkie może być bardziej efektywne niż posiadający każdego testu transakcji, aby sprawdzić, czy aktualizacja jest prawidłowy przed dokonaniem aktualizacji.Wycofywanie zmian i aktualizacji są kosztownych operacji, więc savepoints obowiązują tylko wtedy, gdy brakuje prawdopodobieństwo wystąpią błędu i sprawdzania ważności aktualizacji wcześniej koszt jest stosunkowo wysoka.

W tym przykładzie przedstawiono użycie punkt bezpieczny w system zamówień, w których jest uruchomiony w stanie, ponieważ firma ma skutecznego dostawców prawdopodobieństwo niskiej i zmieniać kolejność punktów.Zazwyczaj aplikacji może sprawdzić, czy za mało zasobów dostępnych przed próbą dokonania aktualizacji, które mogłoby nagrywać zamówienia.W tym przykładzie założono, że jakiegoś powodu uprzedniego sprawdzenia ilości dostępnych zapasów jest stosunkowo drogie (ze względu na łączenie się poprzez powolne modemu lub sieci WAN).Aplikacja może być kodowane wystarczy dokonać aktualizacji, a jeśli uzyska on o błędzie z informacją, że nie ma wystarczającej ilości zapasów, to czy przywrócić aktualizację.W takim przypadek szybkie sprawdzenie @@ błąd po insert przebiega szybciej, niż Weryfikowanie kwoty przed aktualizacją.

The InvCtrl tabela has a CHECK constraint that triggers a 547 error if the QtyInStk kolumna goes below 0. The OrderStock procedure creates a punkt bezpieczny. Jeśli wystąpi błąd 547, powoduje powrót do punkt bezpieczny i zwraca liczbę elementów dostępnych do procesu wywołującego.Proces wywoływania można zastąpić zamówienia w odniesieniu do ilości dostępnych.Jeśli OrderStock Zwraca wartość a 0, to sprawdza do procesu wywołującego jest za mało zasobów dostępnych do zaspokojenia kolejność.

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