PHP + MySQL Transaktionen Beispiele
Ich wirklich noch nicht gefunden, normal Beispiel der PHP-Datei wo MySQL Transaktionen verwendet werden. Können Sie mir zeigen, einfaches Beispiel?
Und noch eine weitere Frage. Ich habe schon viel von Programmierung und nicht aus Transaktionen. Kann ich eine PHP-Funktion oder so etwas in header.php
dass wenn man mysql_query
fehl, so ist der andere scheitern zu?
Ich denke ich habe es herausgefunden, ist es richtig?:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
Sie können
Bitte verwenden Sie nicht
Bedeutet "mysql_query("SET AUTOCOMMIT=0");" setzen Sie alle verbindungen zu warten, für die commit-Funktion oder ist es nur für seine Verwandte Verbindung?
Eigentlich
Dinge, die veraltet nicht "sterben". Gehalten werden Sie offiziell für legacy-software, aber nicht mehr gepflegt und geplagten aus der empfohlenen Praktiken für neue software. Die Tatsache bleibt, nicht mit
mysql_query("BEGIN");
anstelle der Sequenz mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
Bitte verwenden Sie nicht
mysql_*
Funktionen im neuen code. Sie werden nicht mehr gepflegt und sind offiziell deprecated. Siehe die red box? Erfahren Sie mehr über prepared statements und PDO oder MySQLi - diesem Artikel wird Ihnen helfen, entscheiden, welche. Wenn Sie PDO, hier ist ein gutes tutorial.Bedeutet "mysql_query("SET AUTOCOMMIT=0");" setzen Sie alle verbindungen zu warten, für die commit-Funktion oder ist es nur für seine Verwandte Verbindung?
Eigentlich
mysql
wun sterben trotz veraltet Sie werden in PECL für immer.Dinge, die veraltet nicht "sterben". Gehalten werden Sie offiziell für legacy-software, aber nicht mehr gepflegt und geplagten aus der empfohlenen Praktiken für neue software. Die Tatsache bleibt, nicht mit
mysql
InformationsquelleAutor good_evening | 2010-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Idee, die ich in der Regel verwenden Sie bei der Arbeit mit Transaktionen die wie folgt aussieht (halb-pseudo-code):
Beachten Sie, dass mit dieser Idee, wenn eine Abfrage fehlschlägt, wird eine Exception geworfen werden muss:
PDO::setAttribute
PDO::ATTR_ERRMODE
undPDO::ERRMODE_EXCEPTION
Leider gibt es keine Magische beteiligt. Sie können nicht einfach nur ein Befehl irgendwo und Transaktionen automatisch erledigt: Sie haben noch spezifische, die Gruppe von Abfragen, die ausgeführt werden müssen, in einer Transaktion.
Zum Beispiel, oft haben Sie ein paar Fragen, bevor die Transaktion (vor der
begin
) und noch ein paar Abfragen nach der Transaktion (nachcommit
oderrollback
) und du wirst wollen, dass diese Abfragen ausgeführt, egal was passiert ist (oder auch nicht) in der Transaktion.Was ist die
$db
Typ hier? mysqli?Siehe meine Antwort für ein Beispiel, mysqli (ähnlich im Stil von Pascal-Ansatz).
es kann leicht geändert werden, um zu fangen
PDOException
und sogar check exception Werte, wenn nötig. us2.php.net/PDOException$db ist die PDO-Objekt (Verbindung). Ref: php.net/manual/en/pdo.connections.php
InformationsquelleAutor Pascal MARTIN
Ich denke ich habe es herausgefunden, ist es richtig?:
nicht sicher, dies ist der Fall mit InnoDB?
Ich denke, wenn Sie eine Transaktion starten, es funktioniert wie wenn AUTOCOMMIT=0
ist die richtige. Sobald ein Vorgang gestartet wird AUTOCOMMIT=0 wird implizit gesetzt und nach der Transaktion endet entweder durch commit oder rollback, MySql setzt wieder den AUTOCOMMIT-Wert, der verwendet wurde, vor Beginn der Transaktion. HINWEIS: Sie sollten NICHT setzen Sie AUTOCOMMIT=0, weil nach der Begehung werden die änderungen, wenn Sie sich entscheiden, insert - /update-eine weitere Zeile, die Sie sollten sich verpflichten, es explizit.
Motor laden sollte man InnoDB nicht MyISAM!
InformationsquelleAutor good_evening
Willkommen auf StackOverflow. Bitte immer dazu schreiben, beschreiben den text Ihrer Antwort.
sorry im Anfänger, und mein schlechtes Englisch, es ist sehr einfach unter anderem code - für Anfänger - commit() rollback() begin() setzen in der Klasse der DB (zum Beispiel), $query - nicht nur einmal - vielleicht $query0 $Abfrage1 - dann chek Ihnen - ich benutze diesen code, diese sehr leicht zu verstehen =)
Seine Kommentare machen das Beispiel ziemlich klar. Guter code sollte nicht müssen beschreibenden text. Auch die Frage, fordert ein einfaches Beispiel. Ich mag diese Antwort.
für eine einzelne Abfrage Bedarf es keiner Transaktion, einfach verwirrt über die Transaktion, gibt es einen Grund, um mit der Transaktion, die für eine einzelne Abfrage?
InformationsquelleAutor Gedzberg Alex
Als dies ist das erste Ergebnis bei google bei "php mysql transaction", ich dachte, ich würde hinzufügen, eine Antwort, die explizit zeigt, wie dies mit mysqli (wie der ursprüngliche Autor wollte Beispiele). Hier ist ein Vereinfachtes Beispiel der Transaktionen mit PHP/mysqli:
Beachten Sie auch, dass PHP 5.5 verfügt über eine neue Methode mysqli::begin_transaction. Dies hat jedoch nicht dokumentiert wurde, noch durch den PHP-team, und ich bin noch immer in PHP 5.3, so kann ich nicht kommentieren.
+1 für die ausführliche (und kommentierte) Beispiel mit tatsächlichen mysqli-code. Vielen Dank für diese. Und deinen Punkt über locking/Transaktionen ist tatsächlich sehr interessant.
Bedeutet "autocommit(FALSE)" wird auf die andere Verbindung in der gleichen Datenbank/Tabelle ? Ich meine, wenn wir öffnen zwei Seiten, dass einer von Ihnen seine Verbindung zu "autocommit(FALSE)" aber andere Links die autocommit-Funktion, funktioniert es warten für die Funktion "commit" oder nicht. Ich möchte wissen, ob autocommit ist ein Attribut für verbindungen und nicht für Datenbank/Tabellen. Dank
im obigen Beispiel ist nur bei der einzelnen Verbindung - es hat keine Auswirkung auf alle anderen verbindungen zur Datenbank.
HINWEIS: anstelle von
if (!result)
, tun sollteif (result === false)
wenn die Abfrage ist in der Lage die Rückgabe ein gültiges Ergebnis, würde false oder null.InformationsquelleAutor EleventyOne
Bitte überprüfen Sie die Speicher-engine, die Sie verwenden. Wenn es MyISAM, dann
Transaction('COMMIT','ROLLBACK')
werden nicht unterstützt, da nur die InnoDB-Speicher-engine, nicht MyISAM unterstützt Transaktionen.InformationsquelleAutor dinesh
Ich habe eine Funktion um einen Vektor von Abfragen und eine Transaktion durchführen, vielleicht hat jemand finden es nützlich:
InformationsquelleAutor Marco
Bei der Verwendung von PDO-Verbindung:
Häufig verwende ich den folgenden code für Transaktions-management:
Beispiel:
Diese Art der Transaktion-management-code wird nicht dupliziert, über das Projekt. Das ist eine gute Sache, weil, wie aus anderen PDO-ralated Antworten in diesem thread, es ist einfach, Fehler zu machen in ihm. Am häufigsten wird vergessen, rethrow die Ausnahme und Beginn der Transaktion innerhalb der
try
block.InformationsquelleAutor Danila Piatov
Hatte ich diese, aber nicht sicher, ob dies korrekt ist. Könnte das ausprobieren auch.
Idee von hier: http://www.phpknowhow.com/mysql/transactions/
mysql_query
anstelle vonmysqli
, obwohl Sie einen link zu einem tutorial, das verwendetmysqli
. IMHO, sollten Sie entweder löschen dieses schlechte Beispiel, oder ersetzen Sie es verwenden, code wie geschrieben phpknowhow tutorial.InformationsquelleAutor nodeffect
Einer mehr prozeduraler Stil Beispiel mit
mysqli_multi_query
übernimmt$query
ist gefüllt mit Semikolon getrennte Anweisungen.mysqli_multi_query
. Niemanden interessiert, dass sollte google auch sonst für cleaner Beispiel.InformationsquelleAutor guest