MySQLi - Methoden - MySQLi - Transaktionen
1. Das Prinzip
... habe ich ja schon an dieser Stelle erläutert. Anstatt jetzt aber nun mit zig Queries zu arbeiten, kann man bequem die Methoden von MySQLi nutzen. Um denn nun eine Transaktion einzuleiten, gibt es zwei Möglichkeiten.
2. Transaktion starten
Autocommit
Damit klemmt man den gleichnamigen Modus von MySQL ab und Änderungen an einer Datenbank werden nur nach einem Commit dauerhaft vorgenommen. Aber Obacht! Nach der Transaktion sollte man tunlichst den Ursprungszustand wiederherstellen.
// Objektorientiert
$mysqli = new mysqli('host', 'user', 'pw', 'db');
$mysqli -> autocommit(FALSE);
// WICHTIG! Nach der Transaktion wieder zurücksetzen!
$mysqli -> autocommit(TRUE);
// Prozedural
$mysqli = mysqli_connect('host', 'user', 'pw', 'db');
mysqli_autocommit($mysqli, FALSE);
Über einen Query
Hier startet man die Transaktion ganz normal über eine SQL-Anweisung. Anstelle von BEGIN
kann man natürlich auch
START TRANSACTION
nehmen. Der Vorteil dieser Methode ist, dass anschließend der Autocommit-Modus wieder aktiv ist.
// Objektorientiert
$mysqli = new mysqli('host', 'user', 'pw', 'db');
$mysqli -> query ('BEGIN');
// Prozedural
$mysqli = mysqli_connect('host', 'user', 'pw', 'db');
mysqli_query($mysqli, 'BEGIN');
3. Transaktion durchführen
Nach obiger Vorbereitung ist der Rest ein Kinderspiel. Man schickt ein paar Statements ab und kann dann anhand von Bedingungen
prüfen, ob ein commit
oder rollback
durchgeführt wird.
// Objektorientiert
$bla = $mysqli -> query('INSERT INTO bla ...)');
$blubb = $mysqli -> query('INSERT INTO blubb ...)');
if ($bla && $blubb) {
$mysqli -> commit();
}
else {
$mysqli -> rollback();
}
// Prozedural
$bla = mysqli_query($mysqli'INSERT INTO bla ...)');
$blubb = mysqli_query($mysqli,'INSERT INTO blubb ...)');
if ($bla && $blubb) {
mysqli_commit();
}
else {
mysqli_rollback();
}
Ein Hinweis
Etliche haben ein Verständnisproblem. Die glauben nämlich, dass bei Transaktionen die Ausführung von Queries nur simuliert wird. Das stimmt aber nicht. Die Änderungen werden tatsächlich vorgenommen und man kann das Ergebnis auch direkt auslesen.
Aber!
Wenn man kein commit
ausführt, so gehen die Daten just in dem Augenblick hops, wo die Verbindung zum Client getrennt
wird. Denn dann startet automatisch ein Rollback. Und da das bei einem PHP-Script am Ende eigentlich immer der Fall ist, kann
nicht viel passieren.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt