sql >> Databasteknik >  >> RDS >> Mysql

DBI-databashandtag med AutoCommit satt till 0 returnerar inte korrekt data med SELECT?

Jag antar att du använder InnoDB-tabeller och inte MyISAM-tabeller. Som beskrivs i InnoDBs transaktionsmodell , alla dina frågor (inklusive SELECT) sker i en transaktion.

När AutoCommit är på startas en transaktion för varje fråga och om den lyckas begås den implicit (om den misslyckas kan beteendet variera, men transaktionen kommer garanterat att avslutas). Du kan se de implicita commits i MySQL:s binlog. Genom att ställa in AutoCommit till false måste du hantera transaktionerna på egen hand.

Standardnivån för transaktionsisolering är REPETERBAR LÄSNING , vilket betyder att alla SELECT frågor kommer att läsa samma ögonblicksbild (den som upprättades när transaktionen startade).

Förutom lösningen som ges i det andra svaret (ROLLBACK innan du börjar läsa) här är ett par lösningar:

Du kan välja en annan transaktionsisoleringsnivå, som LÄS ENGAGERAG , vilket gör din SELECT frågor läser en ny ögonblicksbild varje gång.

Du kan också lämna AutoCommit till true (standardinställningen) och starta dina egna transaktioner genom att utfärda BEGIN WORK . Detta kommer tillfälligt att inaktivera AutoCommit beteende tills du utfärdar en COMMIT eller ROLLBACK varefter varje fråga får sin egen transaktion igen (eller så startar du en annan med BEGIN WORK ).

Jag personligen skulle välja den senare metoden, eftersom den verkar mer elegant.



  1. PostgreSQL:seriell vs identitet

  2. Okänd MySQL-servervärd

  3. Vilket är det största ID-numret som autoincrement kan producera i mysql

  4. MySQL-fel För många anslutningar