4 Stimmen

Funktioniert eine Mysql-Transaktion, wenn mehrere Verbindungen für die Abfragen verwendet werden?

Hier ist sie also ...

// Ich starte die Transaktion $mysqli = new mysqli(...);

// Start der Transaktion $mysqli->autocommit(FALSE);

  • Hier ist ein select prepared stmt mit eigener Datenbankverbindung
  • Hier ist eine vorbereitete Einfügung mit einer eigenen Datenbankverbindung
  • Hier ist eine vorbereitete Select-Stmt mit der oben genannten Datenbank-Verbindung
  • neue Verbindung einfügen
  • neue Verbindung einfügen
  • neue Verbindung einfügen

wenn jede vorbereitete Abfrage true zurückgibt, wird ($mysqli->commit()) sonst $mysqli->rollback

Ich weiß nicht, aus welchem Grund diese Transaktion automatisch übertragen wird.

Ich habe einige Transaktion mit 3 mehrere Verbindungen getan und sie rolledback... diese nicht... Ist mysql dafür gemacht, eine Transaktion zu unterstützen, die Abfragen mit einzelnen Verbindungen hat?

Gelöst... wenn Abfragen aus verschiedenen Tabellen voneinander abhängig sind, wie in meinem Fall und Sie starke Datenzugriffssicherheit benötigen, setzen Sie autocommit auf false für jede Verbindung, die Sie öffnen, setzen Sie eine var auf false für jede fehlgeschlagene bussness-Logik, wenn etwas fehlschlägt, rollback jeden Satz von Abfragen, sonst comit evry Abfrage... Ja, die Transaktion wird pro Verbindung ausgeführt, hatte etwas anderes, das den Rollback verwaltete, als ich sagte, dass mysql den Rollback für einige Transaktionen mit mehreren Verbindungen durchführte

Re-edit : natürlich wird dies nicht wie eine normale Transaktion funktionieren ... im Falle eines Systemabsturzes werden die Daten bis zum Zeitpunkt des Absturzes gespeichert

11voto

derobert Punkte 47691

Alle Abfragen innerhalb einer Transaktion müssen über dieselbe Verbindung erfolgen. Wenn Sie drei Verbindungen haben, haben Sie drei Transaktionen geöffnet (vorausgesetzt, sie befinden sich nicht im Autocommit-Modus).

Wenn Sie tatsächlich verteilte Transaktionen benötigen, müssen Sie die Die XA-Transaktionen von MySQL -aber das sollte nur erforderlich sein, wenn Sie mit Transaktionen in mehr als einer Datenbank (oder alternativ mit anderen Nicht-Datenbank-Transaktionen) zu tun haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X