Mysql
 sql >> Base de données >  >> RDS >> Mysql

Le handle de base de données DBI avec AutoCommit défini sur 0 ne renvoie pas les données appropriées avec SELECT ?

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.