Antworten auf deine Fragen:
Neues Thema erstellen

InnoDB - Transactions -> funktioniert nicht richtig

d3mueller

PC-Freak :D

Hi,

ich versuche gerade mit der innoDB-Engine und Transactions klar zu kommen. Eigentlich soll das ja unter anderem verhindern, dass gleichzeitige Zugriffe auf die Datenbank verhindert werden, um so Datenverfälschung und so zu verhindern.

Also Skript A hat eine Transaktion gestartet, die z.B. 2 Sekunden dauert.

Aber nach einer Sekunde greift Skript B auch auf die Datenbank zu und will z.B. was auslesen. Eigentlich müsste Skript B doch jetzt warten, bis Skript A fertig ist, oder nicht? Bei mir funktioniert das nicht:

Skript A:

PHP:
$db->query("SET AUTOCOMMIT = 0;");
$db->query("START TRANSACTION;");
try {
    $i = 200;
    while ($i <= 700) {
        // Damit das Skript auch ne Weile läuft, hab ich hier die Schleife eingebaut
        var_dump($db->query("INSERT INTO test VALUES ({$i}, 'testvalue')"));
        $i++;
    }
    $db->query("COMMIT;");
}
catch (Exception $e) {
    $db->query("ROLLBACK;");
    echo $e->getMessage();
}

Skript B:

PHP:
$db->query("SET AUTOCOMMIT = 0;");
$db->query("START TRANSACTION;");

try {
    // Das hier gibt mir einfach ein Array mit den Daten zurück, die mit var_dump ausgegeben werden
    var_dump($db->query("SELECT * FROM test", "assoc"));
    $db->query("COMMIT;");
}
catch (Exception $e) {
    $db->query("ROLLBACK");
    echo $e->getMessage();
}

Das $db->query() führt einfach das SQL aus, das funktioniert auch. Die Datenbanktabelle läuft auch mit der InnoDB-Engine (hab es zumindest ausgwählt beim erstellen)


Wenn ich jetzt die Seite mit Skript A starte und dann ganz schnell (mit meinem Laptop) die andere Seite mit Skript B starte, dann läuft Skript A ja noch.

Jetzt gibt mir Skript B aber nicht die 501 Einträge aus, sondern nur um die 70 Stück, weil Skript A noch nicht fertig war, als ich Skript B aufgerufen habe.

Aber eigentlich sollen doch Transactions genau das verhindern, oder? Das Skript B warten muss, bis Skript A komplett fertig ist.

Habe ich einen Fehler im Code? Oder in meinem Verständnis von Transactions?

Danke schon mal

LG
 

Duddle

Posting-Frequenz: 14µHz

Eine Transaktion wird entweder komplett oder garnicht ausgeführt. Mehr bedeutet sie nicht. Tritt während der Transaktion ein Fehler auf, dann wird die Transaktion als nicht ausgeführt betrachtet und der Zustand ist exakt so, als wenn du die Transaktion nie begonnen hättest (unabhängig von anderen, mglw. parallelen Anfragen).

Wenn du beispielsweise ein großes Update machst und die Datenbank dir währenddessen explodiert, ist sie dennoch weiterhin in einem konsistenten Zustand, weil eben die Auswirkungen nur komplett oder garnicht sichtbar werden.


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.634
Beiträge
1.538.447
Mitglieder
67.555
Neuestes Mitglied
scheflo
Oben