Verwenden von Sicherungspunkten

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 bei einem selten auftretenden Fehler für einen Teil der Transaktion ein Rollback auszuführen, ist u. U. effizienter, als bei jeder Transaktion vor dem Ausführen eines Updates zu ermitteln, ob ein Update zulässig ist. Updates und Rollbacks sind teure Operationen. Sicherungspunkte sind daher nur dann effektiv, wenn die Wahrscheinlichkeit des Fehlers gering ist und die Kosten einer Vorabüberprüfung der Gültigkeit des Updates relativ hoch sind.

Der Microsoft SQL Server 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 im try-Block ein Sicherungspunkt verwendet. Die Anweisungen werden für die Production.ScrapReason-Tabelle in der SQL Server 2005 AdventureWorks-Beispieldatenbank ausgeführt. Für das 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 {
      con.setAutoCommit(false);
      Statement stmt = con.createStatement();
      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();
      stmt.close();
      System.out.println("Transaction succeeded.");
   }
   catch (SQLException ex) {
      ex.printStackTrace();
      try {
         System.out.println("Transaction failed.");
         con.rollback();
      }
      catch (SQLException se) {
         se.printStackTrace();
      }
   }
}

Siehe auch

Andere Ressourcen

Ausführen von Transaktionen mit dem JDBC-Treiber