Start · Sprachen · PHP · Referenz · mysqli_release_savepoint

mysqli_release_savepoint

Funktion

Entfernt einen benannten Sicherungspunkt (Savepoint) aus der Menge der Sicherungspunkte der aktuellen Transaktion.

seit PHP 5.5.0 Kategorie: db

Signatur

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

Beschreibung

mysqli_release_savepoint() sendet ein RELEASE SAVEPOINT-Statement an den MySQL-Server und entfernt damit einen zuvor mit mysqli_savepoint() gesetzten Sicherungspunkt aus der aktuellen Transaktion. Nach dem Entfernen des Savepoints kann nicht mehr zu diesem Punkt zurückgerollt werden – die Transaktion selbst bleibt aber aktiv und muss separat mit mysqli_commit() oder mysqli_rollback() abgeschlossen werden.

Savepoints sind ein Werkzeug für komplexe Transaktionslogik: Man kann innerhalb einer Transaktion Zwischenpunkte setzen, zu denen bei Fehlern teilweise zurückgerollt werden kann, ohne die gesamte Transaktion abzubrechen. Wird ein Savepoint nicht mehr benötigt (etwa weil ein Abschnitt erfolgreich abgeschlossen wurde), sollte er mit mysqli_release_savepoint() freigegeben werden, um Ressourcen auf dem Server zu sparen.

Diese Funktion erfordert eine Datenbank-Engine, die Transaktionen unterstützt, z. B. InnoDB. Bei MyISAM-Tabellen wird die Anweisung zwar akzeptiert, aber ohne Wirkung.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Verbindungsobjekt.
$name Pflicht string Der Name des Savepoints, der entfernt werden soll. Der Name muss exakt dem bei mysqli_savepoint() verwendeten Namen entsprechen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn der Savepoint nicht existiert oder keine aktive Transaktion vorhanden ist).

Beispiele

Savepoint setzen, nutzen und freigeben

<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'meinedb');

if ($mysqli->connect_errno) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

// Autocommit deaktivieren und Transaktion starten
$mysqli->autocommit(false);
$mysqli->begin_transaction();

// Erste Einfügung
$mysqli->query("INSERT INTO bestellungen (produkt, menge) VALUES ('Apfel', 10)");

// Savepoint setzen
mysqli_savepoint($mysqli, 'sp_nach_apfel');

// Zweite Einfügung
$mysqli->query("INSERT INTO bestellungen (produkt, menge) VALUES ('Birne', 5)");

// Savepoint erfolgreich erreicht — Savepoint freigeben
$freigegeben = mysqli_release_savepoint($mysqli, 'sp_nach_apfel');

if ($freigegeben) {
    echo "Savepoint wurde erfolgreich freigegeben.\n";
} else {
    echo "Fehler beim Freigeben des Savepoints.\n";
}

// Transaktion abschließen
$mysqli->commit();
$mysqli->close();
Savepoint wurde erfolgreich freigegeben.

Teilweises Rollback zu einem Savepoint mit anschließender Freigabe

<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'meinedb');
$mysqli->autocommit(false);
$mysqli->begin_transaction();

$mysqli->query("INSERT INTO konten (name, betrag) VALUES ('Alice', 1000)");
mysqli_savepoint($mysqli, 'vor_ueberweisung');

$mysqli->query("UPDATE konten SET betrag = betrag - 200 WHERE name = 'Alice'");

// Fehlerfall: Rollback zum Savepoint
$mysqli->rollback(MYSQLI_TRANS_COR_NO_RELEASE, 'vor_ueberweisung');
echo "Zum Savepoint zurückgerollt.\n";

// Savepoint wird nicht mehr benötigt — freigeben
mysqli_release_savepoint($mysqli, 'vor_ueberweisung');
echo "Savepoint freigegeben.\n";

// Transaktion mit dem ursprünglichen Stand abschließen
$mysqli->commit();
$mysqli->close();
Zum Savepoint zurückgerollt. Savepoint freigegeben.

// Wichtig · Fallstricke

Wichtig: mysqli_release_savepoint() schließt die Transaktion nicht ab. Nach dem Freigeben des Savepoints muss die Transaktion weiterhin explizit mit mysqli_commit() bestätigt oder mit mysqli_rollback() verworfen werden.

Der Savepoint-Name wird direkt in das SQL-Statement eingefügt. Stellen Sie sicher, dass der Name keine Sonderzeichen enthält, die das SQL-Statement manipulieren könnten, um SQL-Injection zu vermeiden. Verwenden Sie nur alphanumerische Zeichen und Unterstriche für Savepoint-Namen.

Wenn der angegebene Savepoint nicht existiert, gibt die Funktion false zurück und ein MySQL-Fehler wird erzeugt. Dies kann mit $mysqli->error abgefragt werden.