In InnoDB müssen Sie Transaktionen für einzelne Abfragen nicht explizit starten oder beenden, wenn Sie die Standardeinstellung von Autocommit, die "on" ist, nicht geändert haben. Wenn Autocommit aktiviert ist, schließt InnoDB automatisch jede einzelne SQL-Abfrage in eine Transaktion ein, was dem Äquivalent von START TRANSACTION; query; COMMIT;
.
Wenn Sie ausdrücklich START TRANSACTION
verwenden in InnoDB mit aktiviertem Autocommit, dann alle Abfragen, die nach einem START TRANSACTION
ausgeführt werden -Anweisung werden entweder alle ausgeführt oder alle schlagen fehl. Dies ist zum Beispiel in Bankenumgebungen nützlich:Wenn ich 500 $ auf Ihr Bankkonto überweise, sollte dieser Vorgang nur erfolgreich sein, wenn der Betrag von meinem Bankguthaben abgezogen und Ihrem hinzugefügt wurde. In diesem Fall würden Sie also so etwas wie
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
Dadurch wird sichergestellt, dass entweder beide Abfragen erfolgreich ausgeführt werden oder keine, aber nicht nur eine. Dieser Beitrag hat etwas mehr darüber, wann Sie Transaktionen verwenden sollten.
In InnoDB werden Sie sehr selten ganze Tabellen sperren müssen; Im Gegensatz zu MyISAM unterstützt InnoDB Sperren auf Zeilenebene. Das bedeutet, dass Clients nicht die gesamte Tabelle sperren müssen, wodurch andere Clients warten müssen. Clients sollten nur die Zeilen sperren, die sie tatsächlich benötigen, damit andere Clients weiterhin auf die Zeilen zugreifen können, die sie benötigen.
Weitere Informationen zu InnoDB-Transaktionen finden Sie hier . Ihre Fragen zu Deadlocks werden in den Abschnitten 14.2.8.8 beantwortet und 14.2.8.9 der Dokumente. Wenn eine Abfrage fehlschlägt, gibt Ihr MySQL-Treiber eine Fehlermeldung zurück, die den Grund angibt; Ihre App sollte die Abfragen dann bei Bedarf erneut ausgeben.
Schließlich haben Sie in Ihrem Beispielcode mysql_query
verwendet . Wenn Sie neuen Code schreiben, hören Sie bitte auf, das alte, langsame und veraltete mysql_
zu verwenden Bibliothek für PHP und verwenden Sie mysqli_
oder stattdessen PDO :)