¿El identificador de base de datos DBI con AutoCommit configurado en 0 no devuelve datos adecuados con SELECT?

Esto es complicado de explicar (y muy raro), así que tengan paciencia conmigo. Explicaré el problema y la solución, pero me gustaría ver si alguien puede explicar por qué funciona de la manera en que funciona :)

Tengo una aplicación web que usa mod_perl. Utiliza la base de datos MySQL, y estoy escribiendo datos en una base de datos de manera regular. Es modular, por lo que también tiene su propio tipo de "base de datos" de módulo, donde manejo conexiones, actualizaciones, etc. La subrutina database :: db_connect () se usa para conectarse a la base de datos, yAutoCommit se establece en 0.

Hice otra aplicación de Perl (demonio independiente), que recupera periódicamente datos de la base de datos y realiza varias tareas según los datos que se devuelven. Incluyo el módulo database.pm en él, así que no tengo que reescribir / duplicar todo.

El problema que estoy experimentando es:

La aplicación se conecta a la base de datos al inicio y luego se repite para siempre, obteniendo datos de la base de datos cada X segundos. Sin embargo, si se actualizan los datos en la base de datos, mi aplicación todavía está devolviendo datos 'antiguos', que obtuve en la conexión / consulta inicial a la base de datos.

Por ejemplo, tengo 3 filas y la columna "Nombre" tiene los valores 'a', 'b' y 'c' - para cada registro. Si actualizo una de las filas (usando el cliente mysql desde la línea de comando, por ejemplo) y cambio el Nombre de 'c' a 'x', mi demonio independiente no obtendrá esos datos, aún recibirá a / b / c devuelto por MySQL Capturé el tráfico de db con tcpdump, y definitivamente pude ver que MySQL realmente estaba devolviendo esos datos. También intenté usar SQL_NO_CACHE con SELECT (ya que no estaba seguro de lo que estaba pasando), pero eso tampoco ayudó.

Luego, modifiqué la cadena de conexión de DB en mi demonio independiente y configuréAutoCommit a 1. De repente, la aplicación comenzó a obtener datos adecuados.

Estoy desconcertado porque pensé que AutoCommit solo afecta los tipos de declaraciones INSERT / UPDATE y no tenía ningún efecto en la declaración SELECT. Pero aparentemente lo hace, y no entiendo por qué.

¿Alguien sabe por qué la instrucción SELECT no devolverá filas 'actualizadas' de la base de datos cuandoAutoCommit está establecido en 0, y por qué devolverá filas actualizadas cuandoAutoCommit se establece en 1?

Aquí hay un código simplificado (extraído de verificación de errores, etc.) que estoy usando en daemon independiente, y que no devuelve filas actualizadas.

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Data::Dumper;
$|=1;

my $dsn = "dbi:mysql:database=mp;mysql_read_default_file=/etc/mysql/database.cnf";
my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 0, AutoCommit => 0});
$dbh->{mysql_enable_utf8} = 1;

while(1)
{
    my $sql = "SELECT * FROM queue";
    my $stb = $dbh->prepare($sql);
    my $ret_hashref = $dbh->selectall_hashref($sql, "ID");
    print Dumper($ret_hashref);
    sleep(30);
}

exit;

CambiandoAutoCommit a 1 corrige esto. ¿Por qué?

Gracias :)

P.S: No estoy seguro si a alguien le importa, pero la versión DBI es 1.613, DBD :: mysql es 4.017, perl es 5.10.1 (en Ubuntu 10.04).

Respuestas a la pregunta(2)

Su respuesta a la pregunta