Transaktionssicherungspunkte

Sicherungspunkte bieten einen Mechanismus, um für Abschnitte einer Transaktion einen Rollback auszuführen. Sie erstellen einen Sicherungspunkt mithilfe der SAVE TRANSACTION savepoint_name-Anweisung. Später führen Sie eine ROLLBACK TRANSACTION savepoint_name-Anweisung aus, um einen Rollback bis zum Sicherungspunkt anstatt bis zum Anfang einer Transaktion auszuführen.

Sicherungspunkte sind vor allem in Situationen hilfreich, in denen das Auftreten von Fehlern unwahrscheinlich ist. Die Verwendung eines Sicherungspunktes, um für einen Teil einer Transaktion im Falle eines seltenen Fehlers einen Rollback auszuführen, kann effizienter sein, als jede Transaktion vor dem Ausführen einer Aktualisierung daraufhin testen zu lassen, ob die Aktualisierung gültig ist. Aktualisierungen und Rollbacks sind kostspielige Operationen. Sicherungspunkte sind also nur dann effektiv, wenn die Wahrscheinlichkeit eines Fehlers gering und die Kosten für die Vorabüberprüfung der Gültigkeit einer Aktualisierung relativ hoch sind.

In diesem Beispiel wird die Verwendung eines Sicherungspunktes in einem Bestellsystem dargestellt, bei dem eine geringe Wahrscheinlichkeit besteht, dass keine Lagerbestände mehr verfügbar sind, da das Unternehmen über zuverlässige Lieferanten verfügt und bei Erreichen festgelegter Bestandszahlen neue Bestellungen ausgibt. In der Regel würde eine Anwendung überprüfen, ob die Lagerbestände ausreichen, ehe sie versucht, Aktualisierungen entsprechend der Bestellung durchzuführen. In diesem Beispiel wird vorausgesetzt, dass eine vorhergehende Kontrolle der Menge an Lagerbeständen aus bestimmten Gründen (wie etwa einer Verbindung über ein langsames Modem oder WAN) relativ teuer ist. Der Anwendungscode kann so geschrieben werden, dass vorerst nur die Aktualisierung vorgenommen wird; falls ein Fehler gemeldet wird, der auf unzureichende Lagerbestände verweist, führt die Anwendung einen Rollback für die Aktualisierung aus. In diesem Fall ist eine rasche Kontrolle von @@ERROR nach dem Einfügen bedeutend schneller als das Überprüfen der Lagerbestände vor der Aktualisierung.

Die InvCtrl-Tabelle verfügt über eine CHECK-Einschränkung, die den Fehler 547 auslöst, wenn der Wert in der QtyInStk-Spalte unter den Wert 0 sinkt. Die OrderStock-Prozedur erstellt einen Sicherungspunkt. Wenn Fehler 547 auftritt, wird ein Rollback bis zum Sicherungspunkt ausgeführt und die Anzahl der verfügbaren Artikel an den aufrufenden Prozess zurückgegeben. Der aufrufende Prozess kann dann die Bestellung auf die vorhandene Menge reduzieren. Wenn OrderStock den Wert 0 zurückgibt, bestätigt dies dem aufrufenden Prozess, dass ausreichend Lagerbestände vorhanden sind, um die Bestellung zu erfüllen.

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

Siehe auch

Andere Ressourcen

ROLLBACK TRANSACTION (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005