sql >> Database >  >> RDS >> Mysql

DBI-databasehandle met AutoCommit ingesteld op 0 die geen juiste gegevens retourneert met SELECT?

Ik veronderstel dat u InnoDB-tabellen gebruikt en niet MyISAM-tabellen. Zoals beschreven in het InnoDB transactiemodel , allemaal uw zoekopdrachten (inclusief SELECT) vinden plaats binnen een transactie.

Wanneer AutoCommit is ingeschakeld, wordt voor elke zoekopdracht een transactie gestart en als deze succesvol is, wordt deze impliciet vastgelegd (als het mislukt, kan het gedrag variëren, maar de transactie wordt gegarandeerd beëindigd). Je kunt de impliciete commits zien in de binlog van MySQL. Door AutoCommit . in te stellen tot false, moet u de transacties zelf beheren.

Het standaard transactie-isolatieniveau is HERHAALBAAR LEZEN , wat betekent dat alle SELECT query's zullen dezelfde momentopname lezen (degene die is gemaakt toen de transactie begon).

Naast de oplossing gegeven in het andere antwoord (ROLLBACK voordat u begint te lezen) zijn hier een aantal oplossingen:

U kunt een ander transactie-isolatieniveau kiezen, zoals LEES TOEGEVOEGD , waardoor uw SELECT query's lezen elke keer een nieuwe momentopname.

U kunt ook AutoCommit leave verlaten naar true (de standaardinstelling) en start uw eigen transacties door BEGIN WORK . op te geven . Hiermee wordt de AutoCommit tijdelijk uitgeschakeld gedrag totdat u een COMMIT . geeft of ROLLBACK statement waarna elke query weer zijn eigen transactie krijgt (of je begint een andere met BEGIN WORK ).

Persoonlijk zou ik voor de laatste methode kiezen, omdat deze eleganter lijkt.



  1. Mijn favoriete PostgreSQL-extensies - deel één

  2. Hoe de uitvoer van de SELECT-query in de opdrachtprompt mooier maken?

  3. Hoe praat Access met ODBC-gegevensbronnen? Deel 2

  4. hoe meerdere afbeeldingen (blob) van mysql weer te geven met php?