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

DBI-Datenbankhandle mit auf 0 gesetztem AutoCommit, das keine korrekten Daten mit SELECT zurückgibt?

Ich nehme an, Sie verwenden InnoDB-Tabellen und keine MyISAM-Tabellen. Wie im Transaktionsmodell von InnoDB beschrieben , alle Ihre Abfragen (einschließlich SELECT) finden innerhalb einer Transaktion statt.

Wenn AutoCommit eingeschaltet ist, wird für jede Abfrage eine Transaktion gestartet, und wenn sie erfolgreich ist, wird sie implizit festgeschrieben (wenn sie fehlschlägt, kann das Verhalten variieren, aber die Transaktion wird garantiert beendet). Sie können die impliziten Commits im Binlog von MySQL sehen. Durch Setzen von AutoCommit auf false, müssen Sie die Transaktionen selbst verwalten.

Die Standard-Transaktionsisolationsstufe ist REPEATABLE READ , was bedeutet, dass alle SELECT Abfragen lesen denselben Snapshot (den, der erstellt wurde, als die Transaktion gestartet wurde).

Zusätzlich zu der in der anderen Antwort angegebenen Lösung (ROLLBACK bevor Sie anfangen zu lesen) hier sind ein paar Lösungen:

Sie können eine andere Transaktionsisolationsstufe wählen, wie VERPFLICHTET LESEN , wodurch Ihr SELECT entsteht Abfragen lesen jedes Mal einen neuen Snapshot.

Sie können AutoCommit auch verlassen auf true (die Standardeinstellung) und starten Sie Ihre eigenen Transaktionen, indem Sie BEGIN WORK ausgeben . Dadurch wird AutoCommit vorübergehend deaktiviert Verhalten, bis Sie ein COMMIT ausgeben oder ROLLBACK Anweisung, nach der jede Abfrage wieder eine eigene Transaktion erhält (oder Sie starten eine andere mit BEGIN WORK ).

Ich persönlich würde letztere Methode wählen, da sie eleganter erscheint.