2012-03-26 13 views
2

Ich habe ein kleines Problem (mangels eines besseren Wortes) mit MySQL db. Ich benutze Python. So habe ich diese Tabelle, in der Zeilen regelmäßig eingefügt werden. So regelmäßig wie 1 Reihe/Sek. Ich führe zwei Python-Skripte zusammen. Eine, die das Einfügen bei 1 Zeile/Sek. Simuliert. Ich habe auch Autocommit ausgeschaltet und explizit Commit nach einer gewissen Anzahl von Zeilen, sagen 10.Python MySQL-Abfragen werden unerwartet zwischengespeichert

Das andere Skript ist eine einfache "SELECT count (*) ..." Abfrage auf der Tabelle. Diese Abfrage zeigt mir nicht die Anzahl der Zeilen, die die Tabelle derzeit hat. Es bleibt hartnäckig in der Anzahl der Zeilen, die der Tisch anfangs hatte, als das Skript gestartet wurde. Ich habe sogar versucht "SELECT SQL_NO_CACHE count (*) ..." ohne Wirkung.

Jede Hilfe wäre willkommen.

+2

Zeigt uns den Code. –

+0

Wenn Sie die Datenbank direkt über die MySQL-Konsole abfragen, können Sie die Einsätze sehen? –

+0

@ learningJava-Ja. Ich kann die Einfügungen sehen, wenn ich die Datenbank von der MySQL-Konsole abfrage. – Sandman

Antwort

1

Wenn Autocommit auch im Reader ausgeschaltet ist, wird es die Lesevorgänge innerhalb einer Transaktion ausführen und somit die Schreibvorgänge des anderen Skripts nicht sehen.

+0

@ KernelM-Dies hat funktioniert. Die Python MySQL API stellt Autocommit automatisch auf False. Ich habe Autocommit auf True gesetzt und es hat funktioniert. Danke vielmals! – Sandman

0

Meine Vermutung ist, dass entweder der Leser oder der Schreiber (höchstwahrscheinlich der Schreiber) innerhalb einer Transaktion arbeitet, die nicht festgeschrieben wurde. Stellen Sie sicher, dass der Writer nach jedem Schreibvorgang festlegt, und versuchen Sie ROLLBACK aus dem Leser, um sicherzustellen, dass es auch nicht innerhalb einer Transaktion ist.

+0

KernelM's Lösung für das Problem hat funktioniert. Es scheint, dass autocommit auch im Lesegerät auf "true" gesetzt sein muss, wenn es die Einfügungen lesen muss, die der Schreiber macht! Vielen Dank für Ihre Antwort! – Sandman

1

Ich schätze, Sie verwenden INNODB mit REPEATABLE READ Isolationsmodus. Versuchen Sie, den Isolationsmodus READ COMMITTED Einstellung:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED 

Eine weitere Möglichkeit, jedes Mal eine neue Transaktion beginnt, führen Sie eine select Abfrage. Read more here

+0

Das ist auch mein Verdacht. –

+0

@ Dikei-Ich habe deine Lösung versucht. Ich habe diese SQL-Anweisung innerhalb des Skripts ausgeführt, das die Einfügungen ausgeführt hat, bevor ich eine der Einfügungen gestartet habe. Ich hoffe, du hast es so gemacht. Das hat das Problem nicht gelöst. Ich war immer noch nicht in der Lage, die Beilagen zu lesen, die der Schreiber aus meinem Leserskript machte. Aber die Lösung von KernelM hat funktioniert. Ich musste Autocommit im Reader auch auf True setzen um die Inserts lesen zu können. In seiner Antwort hat er einen Grund erwähnt, warum dies auch passiert. Vielen Dank für Ihre Antwort! – Sandman

+0

Sie müssen dies im 'Select'-Skript :) – Dikei

Verwandte Themen