Signatur
Beschreibung
mysqli_savepoint() ermöglicht es, innerhalb einer laufenden Datenbanktransaktion einen benannten Sicherungspunkt zu definieren. Auf diesen Sicherungspunkt kann anschließend mit mysqli_rollback() unter Angabe des MYSQLI_TRANS_COR_SAVEPOINT-Flags und des Namens gezielt zurückgerollt werden, ohne die gesamte Transaktion rückgängig zu machen.
Sicherungspunkte sind besonders nützlich bei komplexen Transaktionen, die aus mehreren logischen Schritten bestehen: Schlägt ein späterer Schritt fehl, kann man den Zustand bis zu einem bestimmten Zwischenpunkt wiederherstellen, ohne alle bereits erfolgreich ausgeführten Operationen zu verwerfen.
Die Funktion entspricht dem SQL-Befehl SAVEPOINT name und wird von Datenbank-Engines wie InnoDB unterstützt. Voraussetzung ist, dass Autocommit deaktiviert ist, d. h. eine Transaktion aktiv sein muss.
Die prozedurale Variante mysqli_savepoint() entspricht der objektorientierten Methode mysqli::savepoint().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive MySQLi-Verbindungsinstanz, die mit mysqli_connect() oder new mysqli() erstellt wurde. |
|
| $name Pflicht | string | Der Name des Sicherungspunkts. Muss ein gültiger SQL-Bezeichner sein und innerhalb der Transaktion eindeutig sein. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn keine aktive Transaktion besteht oder der Sicherungspunkt-Name ungültig ist).Beispiele
Sicherungspunkt setzen und partielles Rollback durchführen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Autocommit deaktivieren, um Transaktion zu starten
$mysqli->autocommit(false);
$mysqli->query("INSERT INTO bestellungen (produkt, menge) VALUES ('Apfel', 10)");
// Sicherungspunkt nach erstem Insert setzen
mysqli_savepoint($mysqli, 'nach_apfel');
$mysqli->query("INSERT INTO bestellungen (produkt, menge) VALUES ('Banane', 5)");
// Nur bis zum Sicherungspunkt zurückrollen (Banane-Eintrag wird verworfen)
mysqli_rollback($mysqli, MYSQLI_TRANS_COR_SAVEPOINT, 'nach_apfel');
// Apfel-Eintrag bleibt erhalten und wird committed
$mysqli->commit();
echo "Transaktion abgeschlossen.";
$mysqli->close();
Mehrere Sicherungspunkte in einer Transaktion
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');
mysqli_autocommit($mysqli, false);
mysqli_query($mysqli, "INSERT INTO log (nachricht) VALUES ('Schritt 1')");
mysqli_savepoint($mysqli, 'schritt1');
mysqli_query($mysqli, "INSERT INTO log (nachricht) VALUES ('Schritt 2')");
mysqli_savepoint($mysqli, 'schritt2');
mysqli_query($mysqli, "INSERT INTO log (nachricht) VALUES ('Schritt 3 – fehlerhaft')");
// Fehler erkannt: Nur Schritt 3 verwerfen, zu Schritt 2 zurückrollen
mysqli_rollback($mysqli, MYSQLI_TRANS_COR_SAVEPOINT, 'schritt2');
// Schritte 1 und 2 committen
mysqli_commit($mysqli);
echo "Nur gültige Schritte wurden gespeichert.";
mysqli_close($mysqli);
// Wichtig · Fallstricke
Autocommit: mysqli_savepoint() funktioniert nur innerhalb einer aktiven Transaktion. Ist Autocommit aktiv, werden Savepoints vom Datenbankserver zwar akzeptiert, haben aber keinen praktischen Effekt, da jede Anweisung sofort committed wird.
Engine-Unterstützung: Sicherungspunkte werden nur von transaktionsfähigen Storage-Engines wie InnoDB unterstützt. MyISAM-Tabellen ignorieren Transaktionen und damit auch Savepoints.
Rollback auf Savepoint: Beim Zurückrollen auf einen Sicherungspunkt mit mysqli_rollback() muss das Flag MYSQLI_TRANS_COR_SAVEPOINT sowie der Sicherungspunkt-Name übergeben werden. Savepoints nach dem angegebenen Punkt werden dabei automatisch freigegeben.