j4nk3y: MySQLi transaction/commit/rollback

Beitrag lesen

Nabend,

Ich bin mit der Erklärung bezüglich der "sich aufrufenden" Skripte nicht zufrieden.

Ja, solange a.php nicht komplett ausgeführt wird, findet kein implizites Ende der Transaktion statt.

HM, hier würd ich es gern genau wissen, da ich mir hier unsicher bin. Also bis a.php fertig ist oder bis b.php die Datenverbindung beendet?

die Transaktion endet bei den folgenden Vorkomnissen: Explizit durch Commit oder Rollback, Implizit durch Ende der Datenbankverbindung, letzteres passiert IIRC in PHP ebenfalls implizit, wenn das Script, das die Verbindung geöffnet hat, endet. Da dein a.php ja b.php aufruft, kann es allerdings erstmal nicht vor b.php enden, solange du das nicht explizit hervorrufst (und Multthreading ist in PHP immer noch eher selten).

Super, Danke!

Was kann denn alles "aufrufen" bedeuten? Das, was woodfighter hier meint, ist:

a.php:

// db-code
// starte transaktion
require "b.php"


b.php:
// db-code
// committe transaktion
// Skriptende

Nein genau so bzw. eine funktion in b.php waas aber das gleiche sein müsste meiner Meinung nach.

Was "ruft sich auf" aber auch bedeuten kann:

a.php:

// db-code
// starte transaktion
echo "<a href='b.php'>Klick mich</a>";
// Skriptende

b.php:
// Weitermachen mit den Infos vom Linkklicken
// db-code
// committe transaktion
// Skriptende

Anstelle des Links kann man jede andere Aktivität setzen, bei der das Skript A zunächst endet, sein Ergebnis in Form von HTML, Text, Bildern etc. an den Browser sendet, und diesen veranlasst, danach das Skript B aufzurufen.

Wie oben, a.php endet erst wenn b.php fertig ist.

Und in diesem Fall ist es mit der Transaktion vorbei, weil die DB-Verbindung mit dem Enden von Skript A geschlossen wird und zum Commit führt.

Ja :) verstanden.

Jetzt kann man versuchen, drumherum zu arbeiten. Es gibt da Möglichkeiten. Allerdings haben diese Möglichkeiten auch Nebenwirkungen, über die man sich klarwerden muss.

N drumhgerum arbeiten hab ich früher ml versucht und gemerkt das es unübersichtlich und zu gern zu unfindbren fehlern führen kann, ergo lasse ich das lieber.

Grundsätzlich bedeutet eine laufende Transaktion, dass ein Teil der Daten für den Schreib- oder gar Lesezugriff gesperrt ist. Das kann andere, parallel ablaufende DB-Operationen anhalten. Insofern ist es keine gute Idee, Code zu schreiben, dessen Ausführungszeit unbekannt ist: Skript B könnte irgendwann aufgerufen werden, muss es aber nicht. Wann es aufgerufen wird, ist nicht zu erzwingen, wenn der Aufruf vom Benutzer abhängt.

Anhalten bis die transaktion fertig ist.

Danke

Gruß

Jo