Freigeben über


Verwenden von Sicherungspunkten

JDBC-Treiber herunterladen

Sicherungspunkte bieten einen Mechanismus, um für Teile einer Transaktion ein Rollback auszuführen. In SQL Server können Sie mit der Anweisung „SAVE TRANSACTION Sicherungspunktname“ einen Sicherungspunkt erstellen. Später können Sie die Anweisung "ROLLBACK TRANSACTION Sicherungspunktname" ausführen, um ein Rollback bis zum Sicherungspunkt auszuführen, anstatt ein Rollback bis zum Beginn der Transaktion auszuführen.

Sicherungspunkte sind in Situationen von Nutzen, wenn die Wahrscheinlichkeit gering ist, dass Fehler auftreten. Die Verwendung eines Sicherungspunkts, 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.

Der JDBC Driver unterstützt die Verwendung von Sicherungspunkten über die setSavepoint-Methode der SQLServerConnection-Klasse. Mit der setSavepoint-Methode können Sie in der aktuellen Transaktion einen benannten oder unbenannten Sicherungspunkt erstellen. Die Methode gibt ein SQLServerSavepoint-Objekt zurück. In einer Transaktion können mehrere Sicherungspunkte erstellt werden. Um ein Rollback einer Transaktion bis zu einem bestimmten Sicherungspunkt auszuführen, können Sie das SQLServerSavepoint-Objekt an die rollback-Methode (java.sql.Savepoint) übergeben.

Im folgenden Beispiel wird beim Ausführen einer lokalen Transaktion mit zwei getrennten Anweisungen ein Sicherungspunkt im try-Block verwendet. Die Anweisungen werden für die Production.ScrapReason-Tabelle in der AdventureWorks2022-Beispieldatenbank ausgeführt. Für den Rollback der zweiten Anweisung wird ein Sicherungspunkt verwendet. Dies führt dazu, dass nur für die erste Anweisung ein Commit in der Datenbank ausgeführt wird.

public static void executeTransaction(Connection con) {
    try(Statement stmt = con.createStatement();) {
        con.setAutoCommit(false);
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Correct width')");
        Savepoint save = con.setSavepoint();
        stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong width')");
        con.rollback(save);
        con.commit();
        System.out.println("Transaction succeeded.");
    }
    catch (SQLException ex) {
        ex.printStackTrace();
        try {
            System.out.println("Transaction failed.");
            con.rollback();
        }
        catch (SQLException se) {
            se.printStackTrace();
        }
    }
}

Weitere Informationen

Ausführen von Transaktionen mit dem JDBC-Treiber