Einfügen einer Select-Anweisung in eine Transaktion

10

Was ist der Unterschied zwischen diesen beiden Abfragen:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

Und ohne Transaktion:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Was bewirkt eine SELECTinterne Transaktion?

Wenn in beiden Fällen DELETE FROM orders WHERE id=1direkt nach dem eine andere Sitzung aufgerufen wurde SELECT, wann wird sie verarbeitet?

Songo
quelle

Antworten:

4

Eine SELECT-Abfrage innerhalb einer Transaktion ist an sich nicht ordnungsgemäß vor UPDATEs und DELETEs geschützt.

Was Sie benötigen, um Folgendes zu verwenden:

Wenn Sie ein Problem haben Delete From orders Where id=1, geschieht dies, sobald die Zeilen in der ordersTabelle am Ende der Transaktion ihre Sperren aufgehoben haben. Sie können (bitte auf einem Dev / Staging-Server) mit der Verwendung der READ UNCOMMITTEDTransaktionsisolationsstufe experimentieren , um das Löschen logisch durchzuführen, aber nur beim Festschreiben wird es sichtbar und dauerhaft aufgezeichnet.

Bei der zweiten Transaktion sind grundsätzlich alle Wetten ungültig. Wenn du läufst

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

Laufen Delete From orders Where id=1wird sofort festgeschrieben. Abhängig von der Reihenfolge, in der MySQL diese Anweisungen ausführt, werden die Löschzeilen angezeigt (oder nicht).

VORBEHALT

MySQL 5.6 hat jetzt Folgendes :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Die Modifikatoren READ WRITE und READ ONLY legen den Transaktionszugriffsmodus fest. Sie erlauben oder verbieten Änderungen an Tabellen, die in der Transaktion verwendet werden. Die Einschränkung NUR LESEN verhindert, dass die Transaktion sowohl Transaktions- als auch Nicht-Transaktionstabellen ändert oder sperrt, die für andere Transaktionen sichtbar sind. Die Transaktion kann weiterhin temporäre Tabellen ändern oder sperren. Diese Modifikatoren sind ab MySQL 5.6.5 verfügbar.

RolandoMySQLDBA
quelle