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

L'handle del database DBI con AutoCommit impostato su 0 non restituisce i dati corretti con SELECT?

Suppongo che tu stia usando le tabelle InnoDB e non quelle MyISAM. Come descritto nel modello di transazione di InnoDB , tutti le tue query (incluso SELECT) stanno avvenendo all'interno di una transazione.

Quando AutoCommit è attiva, viene avviata una transazione per ogni query e, se ha esito positivo, viene implicitamente impegnata (se fallisce, il comportamento può variare, ma la transazione è garantita per terminare). Puoi vedere i commit impliciti nel binlog di MySQL. Impostando AutoCommit a false, sei tenuto a gestire le transazioni in autonomia.

Il livello di isolamento della transazione predefinito è REPEATABLE READ , il che significa che tutti SELECT le query leggeranno lo stesso snapshot (quello stabilito all'inizio della transazione).

Oltre alla soluzione data nell'altra risposta (ROLLBACK prima di iniziare a leggere) ecco un paio di soluzioni:

Puoi scegliere un altro livello di isolamento della transazione, come LEGGI IMPEGNATO , che rende il tuo SELECT le query leggono una nuova istantanea ogni volta.

Puoi anche lasciare AutoCommit su true (l'impostazione predefinita) e avvia le tue transazioni emettendo BEGIN WORK . Questo disabiliterà temporaneamente AutoCommit comportamento finché non emetti un COMMIT o ROLLBACK dopo la quale ogni query ottiene di nuovo la propria transazione (oppure ne inizi un'altra con BEGIN WORK ).

Io, personalmente, sceglierei quest'ultimo metodo, in quanto mi sembra più elegante.