Udostępnij za pośrednictwem


Savepoints transakcję

Savepoints oferują mechanizm wycofać części transakcji.Tworzenia punkt zapisu przy użyciu transakcji ZAPISZ savepoint_name instrukcja.Później, wykonać transakcji ROLLBACK savepoint_name instrukcja do przywrócenia punkt zapisu zamiast wycofywania do rozpoczęcia transakcji.

Savepoints są przydatne w sytuacjach, gdy jest prawdopodobne błędy.Korzystanie z punkt zapisu do przywrócenia część transakcji przypadek rzadko błędu może być bardziej efektywne niż przypadek każdego badania transakcji, czy aktualizacja jest prawidłowy, przed dokonaniem aktualizacji.Wycofywanie zmian i aktualizacji są drogie operacji, więc savepoints są skuteczne tylko wtedy, gdy wystąpią błąd prawdopodobieństwo jest niski i koszt wcześniej sprawdzania ważności aktualizacji jest stosunkowo wysokie.

W tym przykładzie przedstawiono korzystanie z punkt zapisu w system zamówień, w którym jest niskie prawdopodobieństwo uruchamianie z zapasów, ponieważ spółka ma skuteczne dostawców i kolejność punktów.Zazwyczaj aplikacji może sprawdzić, czy wystarczającej ilości zapasów zapasów przed próbą dokonania aktualizacji, które mogłoby nagrywać kolejność.W tym przykładzie założono, że zaistnieje wcześniej sprawdzania ilości dostępnych zapasów jest stosunkowo kosztowne (ze względu na łączenie się poprzez powolne modemu lub WAN).Aplikacja może być kodowane wystarczy dokonać aktualizacji i jeżeli uzyska błąd wskazujący, że nie ma wystarczającej ilości zapasów, czy wycofać aktualizacji.W takim przypadek szybkie sprawdzanie błędów @@ po Wstaw jest znacznie szybsza niż weryfikowania kwoty przed aktualizacją.

InvCtrl Tabela ma ograniczenie typu CHECK, która wyzwala 547 błąd, jeśli QtyInStk kolumna przechodzi poniżej 0.OrderStock Procedura tworzy punkt zapisu.Jeśli wystąpi błąd 547, wycofywaniu z punkt zapisu i zwraca liczbę elementów dostępnych do procesu wywołującego.Proces wywoływania można zastąpić zamówienia dla ilości zapasów.Jeśli OrderStock zwraca wartość typu 0, zweryfikuje do procesu wywołującego została wystarczająca ilość zapasów, w celu zaspokojenia zamówienia.

SET NOCOUNT OFF;
GO
USE AdventureWorks2008R2;
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