Ein SQL SAVEPOINT ist eine Marke innerhalb einer laufenden Transaktion. Mit ROLLBACK TO SAVEPOINT kann man nur die Änderungen nach dieser Marke verwerfen, während der Rest der Transaktion erhalten bleibt. Das ist die feinere Alternative zum vollständigen ROLLBACK: Statt die gesamte Transaktion abzubrechen, lässt sich ein einzelner fehlgeschlagener Teilschritt zurücksetzen.

Grundlegende Anweisungen

  • SAVEPOINT name; – Marke an der aktuellen Position setzen
  • ROLLBACK TO SAVEPOINT name; – Änderungen seit der Marke verwerfen
  • RELEASE SAVEPOINT name; – Marke löschen, ohne etwas zurückzurollen
BEGIN;
UPDATE konten SET saldo = saldo - 100 WHERE id = 1;
SAVEPOINT nach_abzug;
UPDATE konten SET saldo = saldo + 100 WHERE id = 2;
-- Fehler bei Konto 2 erkannt:
ROLLBACK TO SAVEPOINT nach_abzug;
-- Nur die Gutschrift wurde verworfen, der Abzug bleibt
COMMIT;

Nach einem ROLLBACK TO SAVEPOINT bleiben alle Marken, die nach dem Ziel-Savepoint gesetzt wurden, gelöscht; die Ziel-Marke selbst bleibt bestehen und kann erneut verwendet werden.

Einsatz: Fehlerbehandlung in langen Läufen

Typisch ist die Verarbeitung vieler Datensätze in einer Schleife – etwa per CURSOR. Ein fehlerhafter Datensatz soll die ganze Transaktion nicht kippen lassen:

SAVEPOINT vor_satz;
BEGIN TRY
  -- Verarbeitung eines Datensatzes
END TRY
BEGIN CATCH
  ROLLBACK TO SAVEPOINT vor_satz;
  INSERT INTO import_fehler (id, meldung) VALUES (@id, ERROR_MESSAGE());
END CATCH;

Viele Datenbanksysteme haben keine echten verschachtelten Transaktionen – Savepoints übernehmen diese Rolle: ORMs wie Laravel nutzen Savepoints, um verschachtelte Transaktionen nachzubilden.

Wichtige Einschränkungen

  • MySQL/MariaDB: DDL-Anweisungen wie CREATE TABLE oder ALTER lösen einen impliziten Commit aus – die Transaktion und der gesamte Savepoint-Stack enden sofort. Ein späteres ROLLBACK TO SAVEPOINT liefert dann einen Fehler (z. B. ERROR 1305).
  • Gleicher Name: Setzt man einen Savepoint erneut mit demselben Namen, wird der alte ersetzt.
  • PostgreSQL/Oracle: Bei ROLLBACK TO darf das Wort SAVEPOINT weggelassen werden; der SQL-Standard verlangt es.
  • Savepoints wirken nur innerhalb einer Transaktion – ohne BEGIN existiert keine Marke.

Abgrenzung

ROLLBACK verwirft die gesamte Transaktion, ROLLBACK TO SAVEPOINT nur einen Teil. Die ACID-Eigenschaften bleiben durch Savepoints unangetastet – sie steuern nur, welche Änderungen am Ende committet werden. Bei verteilten Transaktionen übernimmt Two-Phase Commit diese Rolle.

Verwandte Grundlagen: Transaktionen, SQL INSERT, SQL UPDATE, SQL LATERAL, SQL CURSOR und Rollback.