Supongo que está utilizando tablas InnoDB y no MyISAM. Como se describe en el modelo de transacción de InnoDB , todos sus consultas (incluida SELECT) se realizan dentro de una transacción.
Cuando AutoCommit
está activado, se inicia una transacción para cada consulta y, si tiene éxito, se confirma implícitamente (si falla, el comportamiento puede variar, pero se garantiza que la transacción finalizará). Puede ver las confirmaciones implícitas en el binlog de MySQL. Configurando AutoCommit
a falso, debe administrar las transacciones por su cuenta.
El nivel de aislamiento de transacción predeterminado es LECTURA REPETIBLE , lo que significa que todos los SELECT
las consultas leerán la misma instantánea (la establecida cuando comenzó la transacción).
Además de la solución dada en la otra respuesta (ROLLBACK
antes de comenzar a leer) aquí hay un par de soluciones:
Puede elegir otro nivel de aislamiento de transacciones, como LEER COMPROMETIDO
, lo que hace que su SELECT
las consultas leen una instantánea nueva cada vez.
También puede dejar AutoCommit
a verdadero (la configuración predeterminada) e inicie sus propias transacciones emitiendo BEGIN WORK
. Esto deshabilitará temporalmente el AutoCommit
comportamiento hasta que emita un COMMIT
o ROLLBACK
declaración después de la cual cada consulta obtiene su propia transacción nuevamente (o comienza otra con BEGIN WORK
).
Yo, personalmente, elegiría este último método, ya que me parece más elegante.