Hauptmenü

Untermenü

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($mysqliFALSE);

Ü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