Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL InnoDB - Verwirrt über Transaktionen

Wenn das Problem so etwas wie "Diese Einfügung hat einen eindeutigen Schlüssel verletzt ", wird der Commit ausgeführt. Sie müssen selbst prüfen, ob die Abfrage Fehler zurückgegeben hat, und wenn ja, ROLLBACK .

Wenn das Problem beispielsweise ein unerwartetes Herunterfahren des Servers ist, werden die Abfragen 1 und 2 nicht ausgeführt.

Da Ihre 3 Abfragen hier gleich sind, ist dies natürlich ein dummes Beispiel. Ändern Sie zumindest den lid um zu sehen. Warum machst du nicht einen Schnelltest?

Bearbeiten:Sie haben Ihre Frage zum Zweck von Transaktionen bearbeitet.

Der Zweck von Transaktionen besteht in der Tat darin, die Datenbank in einem konsistenten Zustand zu halten (Lesen Sie mehr über ACID ), aber es ist Sache des Programmierers zu entscheiden, was konsistent ist. Sehen Sie sich die Antwort von prodigitalson an um ein Beispiel für einen möglichen PHP-Weg zum Abfangen von Fehlern zu sehen, der dies für Sie erledigt. Aber während Sie sich in einer Transaktion befinden, werden andere Prozesse die Änderungen, die Ihre Transaktion durchführt, nicht sehen - daher atomar und isoliert.

CREATE TABLE `testkeys` (
  `lid` INT,
  `column_name` VARCHAR(50),
  UNIQUE KEY `testuniq` (`lid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

BEGIN;
INSERT INTO testkeys(lid,column_name) VALUES(1,'test 1');
INSERT INTO testkeys(lid,column_name) VALUES(2,'test 2');
INSERT INTO testkeys(lid,column_name) VALUES(3,'test 3');
INSERT INTO testkeys(lid,column_name) VALUES(2,'test 2b');
COMMIT;