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.