Start · Sprachen · PHP · Referenz · mysqli_savepoint

mysqli_savepoint

Funktion

Setzt einen benannten Sicherungspunkt (Savepoint) innerhalb einer aktiven Transaktion.

seit PHP 5.5.0 Kategorie: db

Signatur

mysqli_savepoint(mysqli $mysql, string $name): bool

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

Typ
bool
Beschreibung
Gibt 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();
Transaktion abgeschlossen.

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);
Nur gültige Schritte wurden gespeichert.

// 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.