DBI-Datenbankhandle, bei dem AutoCommit auf 0 gesetzt ist und bei SELECT? @ Keine korrekten Daten zurückgegeben werd

Dies ist schwierig zu erklären (und sehr seltsam), also nimm es mit mir. Ich werde das Problem und die Lösung dafür erklären, aber ich würde gerne sehen, ob jemand erklären kann, warum es so funktioniert, wie es funktioniert:)

Ich habe eine Webanwendung, die mod_perl verwendet. Es verwendet eine MySQL-Datenbank und ich schreibe regelmäßig Daten in eine Datenbank. Es ist modular aufgebaut, hat also auch einen eigenen 'Datenbank'-Typ eines Moduls, in dem ich Verbindungen, Aktualisierungen usw. bearbeite. Mit der Subroutine database :: db_connect () wird eine Verbindung zur Datenbank hergestellt, undAutoCommit ist auf 0 gesetzt.

Ich habe eine andere Perl-Anwendung (Standalone-Daemon) erstellt, die regelmäßig Daten aus der Datenbank abruft und abhängig von den zurückgegebenen Daten verschiedene Aufgaben ausführt. Ich füge das database.pm-Modul hinzu, damit ich nicht alles neu schreiben / duplizieren muss.

Problem, das ich erlebe, ist:

Application stellt beim Start eine Verbindung zur Datenbank her und führt dann alle X Sekunden eine Endlosschleife durch, um Daten aus der Datenbank abzurufen. Wenn jedoch Daten in der Datenbank aktualisiert werden, werden meiner Anwendung immer noch "alte" Daten zurückgegeben, die ich bei der ersten Verbindung / Abfrage zur Datenbank erhalten habe.

Zum Beispiel - Ich habe 3 Zeilen und Spalte "Name" hat die Werte "a", "b" und "c" - für jeden Datensatz. Wenn ich eine der Zeilen aktualisiere (z. B. mit dem MySQL-Client über die Befehlszeile) und den Namen von "c" in "x" ändere, erhält mein eigenständiger Daemon diese Daten nicht - es wird immer noch ein / b / c zurückgegeben MySQL. Ich habe den Datenbankverkehr mit tcpdump erfasst und konnte definitiv feststellen, dass MySQL diese Daten wirklich zurückgab. Ich habe versucht, SQL_NO_CACHE auch mit SELECT zu verwenden (da ich nicht sicher war, was los war), aber das hat auch nicht geholfen.

Dann habe ich die DB-Verbindungszeichenfolge in meinem Standalone-Daemon geändert und @ gesetzAutoCommitlötzlich erhielt die Anwendung die richtigen Date

Ich bin verwirrt, weil ich dachte, dass AutoCommit nur die Anweisungstypen INSERT / UPDATE betrifft und die SELECT-Anweisung nicht beeinflusst. Aber es scheint, und ich verstehe nicht warum.

Weiß jemand, warum die SELECT-Anweisung keine 'aktualisierten' Zeilen aus der Datenbank zurückgibt, wennAutoCommit ist auf 0 gesetzt, und warum werden aktualisierte Zeilen zurückgegeben, wennAutoCommit ist auf 1 gesetzt?

Hier ist ein vereinfachter Code (herausgenommene Fehlerprüfung usw.), den ich in einem eigenständigen Daemon verwende und der keine aktualisierten Zeilen zurückgibt.

#!/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;

ÄndernAutoCommit bis 1 behebt dies. Warum

Vielen Dank :

P.S: Ich bin mir nicht sicher, ob es jemanden interessiert, aber die DBI-Version ist 1.613, DBD :: mysql ist 4.017, Perl ist 5.10.1 (unter Ubuntu 10.04).

Antworten auf die Frage(4)

Ihre Antwort auf die Frage