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:
Skript B:
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
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