Ich habe wirklich kein normales Beispiel für eine PHP-Datei gefunden, in der MySQL-Transaktionen verwendet werden. Können Sie mir ein einfaches Beispiel dafür zeigen?
Und noch eine Frage. Ich habe bereits viel programmiert und keine Transaktionen verwendet. Kann ich eine PHP-Funktion oder etwas anderes hinzufügen header.php
, wenn eine mysql_query
ausfällt, dann fallen auch die anderen aus?
Ich glaube, ich habe es herausgefunden, stimmt es?:
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");
}
php
mysql
transactions
guten Abend
quelle
quelle
mysql_query("BEGIN");
anstelle von Sequenz verwendenmysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
Funktionen in neuem Code . Sie werden nicht mehr gewartet und sind offiziell veraltet . Sehen Sie die rote Box ? Erfahrenmehr über vorbereitete Anweisungen statt, und verwenden Sie PDO oder MySQLi - dieser Artikel wird Ihnen helfen, entscheidenwelche. Wenn Sie sich für PDO entscheiden, finden Sie hier ein gutes Tutorial .mysql
sterben, obwohl es veraltet ist, wird es für immer in PECL verfügbar sein.mysql
Antworten:
Die Idee, die ich normalerweise bei der Arbeit mit Transaktionen verwende, sieht folgendermaßen aus (Semi-Pseudo-Code) :
Beachten Sie, dass bei dieser Idee, wenn eine Abfrage fehlschlägt, eine Ausnahme ausgelöst werden muss:
PDO::setAttribute
PDO::ATTR_ERRMODE
undPDO::ERRMODE_EXCEPTION
Leider gibt es keine Magie. Sie können nicht einfach irgendwo eine Anweisung platzieren und Transaktionen automatisch ausführen lassen: Sie müssen immer noch angeben, welche Gruppe von Abfragen in einer Transaktion ausgeführt werden muss.
Zum Beispiel sehr oft werden Sie ein paar Anfragen , die vor der Transaktion haben (vor dem
begin
) und ein anderes Paar von Abfragen nach der Transaktion (entweder nachcommit
oderrollback
) , und Sie werden diese Abfragen ausgeführt wollen , egal was passiert ist (oder nicht) in die Transaktion.quelle
$db
Typ hier? Mysqli?PDOException
bei Bedarf Ausnahmewerte abzufangen und sogar zu überprüfen. us2.php.net/PDOExceptionIch glaube, ich habe es herausgefunden, stimmt es?:
quelle
quelle
Da dies das erste Ergebnis bei Google für "php mysql transaction" ist, dachte ich, ich würde eine Antwort hinzufügen, die explizit zeigt, wie dies mit mysqli gemacht wird (wie der ursprüngliche Autor Beispiele wollte). Hier ist ein vereinfachtes Beispiel für Transaktionen mit PHP / mysqli:
Beachten Sie auch, dass PHP 5.5 eine neue Methode mysqli :: begin_transaction hat . Dies wurde jedoch noch nicht vom PHP-Team dokumentiert, und ich stecke immer noch in PHP 5.3 fest, daher kann ich keinen Kommentar dazu abgeben.
quelle
$conn->autocommit(FALSE)
sich im obigen Beispiel nur auf die einzelne Verbindung aus - es hat keine Auswirkungen auf andere Verbindungen zur Datenbank.if (!result)
, sollte diesif (result === false)
der Fall sein , wenn die Abfrage ein gültiges Ergebnis zurückgeben kann, das als falsch oder null ausgewertet wird.Bitte überprüfen Sie, welche Speicher-Engine Sie verwenden. Wenn es sich um MyISAM handelt,
Transaction('COMMIT','ROLLBACK')
wird dies nicht unterstützt, da nur die InnoDB-Speicher-Engine und nicht MyISAM Transaktionen unterstützt.quelle
Bei Verwendung der PDO-Verbindung:
Ich verwende häufig den folgenden Code für das Transaktionsmanagement:
Anwendungsbeispiel:
Auf diese Weise wird der Transaktionsverwaltungscode nicht im gesamten Projekt dupliziert. Das ist eine gute Sache, denn nach anderen PDO-bewerteten Antworten in diesem Thread zu urteilen, ist es leicht, Fehler darin zu machen. Die häufigsten sind das Vergessen, die Ausnahme erneut auszulösen und die Transaktion innerhalb des
try
Blocks zu starten .quelle
Ich habe eine Funktion erstellt, um einen Vektor von Abfragen abzurufen und eine Transaktion durchzuführen. Vielleicht findet es jemand nützlich:
quelle
Ich hatte das, bin mir aber nicht sicher, ob das richtig ist. Könnte das auch ausprobieren.
Idee von hier: http://www.phpknowhow.com/mysql/transactions/
quelle
mysql_query
, anstatt es zu verwendenmysqli
, obwohl Sie auf ein Tutorial verlinken, das verwendet wirdmysqli
. IMHO sollten Sie entweder dieses schlechte Beispiel löschen oder es ersetzen, um Code zu verwenden, wie er im phpknowhow-Tutorial geschrieben wurde.Ein weiteres Beispiel für einen prozeduralen Stil mit
mysqli_multi_query
, angenommen,$query
ist mit durch Semikolons getrennten Anweisungen gefüllt.quelle
mysqli_multi_query
. Jeder, der daran interessiert ist, sollte an anderer Stelle nach einem saubereren Beispiel suchen.