## SQL SAVEPOINT-Anweisungen (savepoint/rollback_to_/release_savepoint_statement)

Innerhalb einer Transaktion können Subtransaktionen definiert werden, die dazu dienen, eine Folge von Datenbankoperationen innerhalb einer Transaktion bezüglich der Änderungen in der Datenbank als Einheit erscheinen zu lassen.

Durch die SAVEPOINT-Anweisung wird ein SQL-Savepoint und damit der Beginn einer Subtransaktion innerhalb einer Transaktion definiert und diesem SQL-Savepoint ein Name zugeordnet. Durch eine spätere ROLLBACK TO-Anweisung mit Angabe des SQL-Savepoint-Namens können alle zwischenzeitlich durchgeführten Änderungen rückgängig gemacht werden, ohne solche Datenbankoperationen zu beeinflussen, die innerhalb der Transaktion vor dem Beginn dieser Subtransaktion durchgeführt wurden. Dabei wird auch der SQL-Savepoint gelöscht. Das Löschen von SQL-Savepoints kann ebenfalls mit Hilfe der RELEASE SAVEPOINT-Anweisung erfolgen.

Ein durch eine SAVEPOINT-Anweisung definierter SQL-Savepoint ist kein Savepoint.

### Syntax

<savepoint_statement> ::= SAVEPOINT <sql_savepoint_name>

<rollback_to_statement> ::= ROLLBACK TO [SAVEPOINT] <sql_savepoint_name>

<release_savepoint_statement> ::= RELEASE SAVEPOINT <sql_savepoint_name>

<sql_savepoint_name> ::= <identifier>

### Erläuterung

#### SAVEPOINT-Anweisung

Durch die SAVEPOINT-Anweisung wird eine Subtransaktion eröffnet, d.h. vom Datenbanksystem wird der aktuelle Standpunkt (SQL-Savepoint) innerhalb der Transaktion festgehalten und dem Namen sql_savepoint_name zugeordnet. Der SQL-Savepoint wird als aktiv gekennzeichnet. Anschließend kann eine beliebige Folge von SQL-Anweisungen innerhalb einer Transaktion folgen. Die Folge von SQL-Anweisungen kann weitere SAVEPOINT-Anweisungen enthalten, höchstens können jedoch 50 SQL-Savepoints in einer Transaktion aktiv sein.

Die Namen der SQL-Savepoints einer Transaktion müssen voneinander verschieden sein. Wenn ein SQL-Savepoint-Name innerhalb einer Transaktion zweimal vergeben wird, wird der SQL-Savepoint der Transaktion inaktiv, der durch die erste SAVEPOINT-Anweisung definiert wurde.

#### ROLLBACK TO-Anweisung

Durch eine ROLLBACK TO-Anweisung können alle Datenbankänderungen, die innerhalb der aktiven Transaktion nach der SAVEPOINT-Anweisung erfolgten, rückgängig gemacht werden.

Der in der ROLLBACK TO-Anweisung angegebene SQL-Savepoint muss ein innerhalb der Transaktion aktiver SQL-Savepoint sein. Alle SQL-Savepoints, die nach diesem SQL-Savepoint erzeugt wurden, werden inaktiv. Alle SQL-Savepoints, die vor diesem SQL-Savepoint erzeugt wurden, bleiben in ihrem Zustand.

Der angegebene SQL-Savepoint bleibt auch nach Ausführung der ROLLBACK TO-Anweisung aktiv, d.h. es ist möglich, die ROLLBACK TO-Anweisung innerhalb der gleichen Transaktion mehrfach unter Angabe des gleichen SQL-Savepoint-Namens auszuführen.

#### RELEASE SAVEPOINT-Anweisung

Durch eine RELEASE SAVEPOINT-Anweisung kann eine SQL-Savepoint deaktiviert werden. Der in der RELEASE SAVEPOINT-Anwesiung angegebene SQL-Savepoint muss ein innerhalb der Transaktion aktiver SQL-Savepoint sein.

Alle SQL-Savepoints, die nach diesem SQL-Savepoint aktiviert wurden, werden ebenfalls inaktiv. Alle SQL-Savepoints, die vor diesem SQL-Savepoint erzeugt wurden, bleiben in ihrem Zustand.

#### Weitere Informationen

Die SQL SAVEPOINT-Anweisungen haben keinen Einfluss auf Sperren, die der Transaktion zugeordnet sind. Insbesondere werden bei diesen SQL-Anweisungen keine Sperren freigegeben. Diese werden erst durch COMMIT oder ROLLBACK freigegeben

Subtransaktionen eignen sich besonders dafür, die Auswirkungen von Datenbankprozeduren atomar zu machen, d. h. sie so zu gestalten, dass sie entweder alle ihre Aufgaben erfüllen oder andernfalls keine Wirkung haben. Dazu wird am Beginn ein SAVEPOINT-Anweisung angegeben. Wenn das Unterprogramm seine Aufgabe nicht erfolgreich erfüllen konnte, können alle von der Datenbankprozedur durchgeführten Änderungen durch eine ROLLBACK TO-Anweisung rückgängig gemacht werden.

Durch die COMMIT-Anweisung und die ROLLBACK-Anweisung werden alle noch offenen Subtransaktionen implizit geschlossen.

Siehe auch:

Transaktionen

SUBTRANS-Anweisung (subtrans_statement)