sql >> Base de Datos >  >> RDS >> Mysql

¿El controlador de la base de datos DBI con AutoCommit establecido en 0 no devuelve los datos adecuados con SELECT?

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.