sql >> Database teknologi >  >> RDS >> Mysql

DBI-databasehåndtag med AutoCommit sat til 0 returnerer ikke korrekte data med SELECT?

Jeg formoder, at du bruger InnoDB-tabeller og ikke MyISAM-tabeller. Som beskrevet i InnoDB transaktionsmodellen , alle dine forespørgsler (inklusive SELECT) finder sted i en transaktion.

Når AutoCommit er slået til, startes en transaktion for hver forespørgsel, og hvis den lykkes, er den implicit begået (hvis den mislykkes, kan adfærden variere, men transaktionen slutter med garanti). Du kan se de implicitte commits i MySQL's binlog. Ved at indstille AutoCommit til falsk, er du forpligtet til at administrere transaktionerne på egen hånd.

Standardtransaktionsisoleringsniveauet er GENTAGLIG LÆSNING , hvilket betyder, at alle SELECT forespørgsler vil læse det samme øjebliksbillede (det, der blev oprettet, da transaktionen startede).

Ud over løsningen givet i det andet svar (ROLLBACK før du begynder at læse) her er et par løsninger:

Du kan vælge et andet transaktionsisoleringsniveau, såsom LÆS ENGAGEMENT , hvilket gør din SELECT forespørgsler læser et nyt øjebliksbillede hver gang.

Du kan også forlade AutoCommit til sand (standardindstillingen) og start dine egne transaktioner ved at udstede BEGIN WORK . Dette vil midlertidigt deaktivere AutoCommit adfærd, indtil du udsteder en COMMIT eller ROLLBACK sætning, hvorefter hver forespørgsel får sin egen transaktion igen (eller du starter en anden med BEGIN WORK ).

Jeg ville personligt vælge den sidste metode, da den virker mere elegant.



  1. Er fremmednøgler virkelig nødvendige i et databasedesign?

  2. Import af excel-filer med variable overskrifter

  3. ActiveRecord::StatementInvalid:PG InFailedSqlTransaction

  4. .NET, C#, LINQ, SQL og OR-Mapping - jeg forstår det bare ikke :(