2016-05-28 3 views
0

Ich verwende eine Warteschlange zum Einreihen von Transaktionen für eine MySQL-Datenbank in Python. Ich verwende Autocommit = False, damit ich eine Transaktion zurücksetzen kann, wenn nicht alle Datenabfragen ordnungsgemäß ausgeführt werden.Ist es möglich, nach Db-Updates zu suchen, bevor db.rollback() in einer Worker-Transaktion ausgeführt wird?

Ich frage mich, ob es möglich ist, zu überprüfen, ob ein Worker eine Aktion für die Datenbank durchgeführt hat, bevor db.rollback() ausgeführt wird? Oder können Sie db.rollback ausführen, selbst wenn ein Worker nichts mit der Datenbank getan hat, ohne dass Fehler aufgetreten sind?

Danke!

Antwort

2

Wenn ich die Frage richtig verstanden habe, ist es nicht ein Fehler, eine Transaktion rückgängig zu machen, wo sonst nichts passiert ist, obwohl es ist ein Fehler rückgängig zu machen, um zu versuchen, wenn keine Transaktion vorhanden ist. Um festzustellen, welcher Fall der Fall ist, können Sie die MySQLConnection.in_transaction property testen.

+0

das ist genau das, was ich brauchte, danke! – chris

+0

Wenn die Verbindung mit 'autocommit = false 'initialisiert wurde, gibt es nicht sofort eine Transaktion? – EagleRainbow

0

Wenn Sie ein

START TRANSACTION; 

Ausgabe

, Senden des Befehls (die die Verbindung in die gleiche wie autocommit = false bringt)
ROLLBACK WORK; 

(siehe auch https://dev.mysql.com/doc/refman/5.5/en/commit.html) kehrt mit

0 row(s) affected 

Also, das bedeutet, Sie können Rollbac k eine leere Transaktion sicher (getestet auf MySQL 5.1.49-3).

Alternativ können Sie in einem Worker immer eine lokale/statische Variable speichern, die mit false initialisiert wird. Wenn vom Worker mindestens ein Aktualisierungsbefehl ausgegeben wurde, legen Sie diese Variable auf true fest.

Wenn Sie später entscheiden müssen, ob zu ROLLBACK oder nicht, schauen Sie sich die Variable an: Wenn sie true ist, wissen Sie, dass Sie mindestens einen Update-Befehl über den DB-Kanal gesendet haben.

Verwandte Themen