Je suppose que vous utilisez des tables InnoDB et non des tables MyISAM. Comme décrit dans le modèle de transaction d'InnoDB , tous vos requêtes (y compris SELECT) se déroulent dans une transaction.
Lorsque AutoCommit
est activé, une transaction est démarrée pour chaque requête et si elle réussit, elle est implicitement validée (en cas d'échec, le comportement peut varier, mais la transaction est garantie de se terminer). Vous pouvez voir les commits implicites dans le binlog de MySQL. En définissant AutoCommit
à false, vous devez gérer vous-même les transactions.
Le niveau d'isolement de transaction par défaut est REPEATABLE READ , ce qui signifie que tous les SELECT
les requêtes liront le même instantané (celui établi au début de la transaction).
En plus de la solution donnée dans l'autre réponse (ROLLBACK
avant de commencer à lire) voici quelques solutions :
Vous pouvez choisir un autre niveau d'isolation de transaction, comme LIRE COMMIT
, ce qui rend votre SELECT
les requêtes lisent un nouvel instantané à chaque fois.
Vous pouvez également laisser AutoCommit
sur true (paramètre par défaut) et démarrez vos propres transactions en émettant BEGIN WORK
. Cela désactivera temporairement le AutoCommit
comportement jusqu'à ce que vous émettiez un COMMIT
ou ROLLBACK
instruction après laquelle chaque requête obtient à nouveau sa propre transaction (ou vous en démarrez une autre avec BEGIN WORK
).
Personnellement, je choisirais cette dernière méthode, car elle semble plus élégante.