2012-07-18 3 views
6

Ich versuche herauszufinden, wie Transaktionen in Twisted Adbapi-Modul arbeiten. Ich verwende derzeit runOperation(), um INSERT- und UPDATE-Anweisungen auszuführen. Die Dokumentation, auf die ich unten verlinke, lässt den Eindruck entstehen, dass Transaktionen unterstützt werden, aber es scheint nicht so zu sein, wie ich es möchte. Hier ist ein Beispiel-Code (seine in ein Zyklon-Webserver ausgeführt wird, aber hoffentlich das ist nicht relevant):Transaktion Unterstützung in Twisted Adbapi

class OperationHandler(cyclone.web.RequestHandler): 
    @cyclone.web.asynchronous 
    def get(self, *args, **kwargs): 
     d = conn.runOperation("INSERT INTO Table1 (Field1, Field2) VALUES ('a', 'b')") 
     d.addCallback(self.next1) 

    def next1(self, rows): 
     d = conn.runOperation("UPDATE Table1 SET Field1 = 'c'") 
     d.addCallback(self.next2) 

    def next2(self, rows): 
     raise Exception("rollback") 
     self.finish("done") 

In diesem Fall, auch wenn eine Ausnahme in dem letzten Rückruf ausgelöst wird, sowohl die INSERT und UPDATE-Anweisung ausgeführt werden . Nicht was ich will.

Ich habe versucht, über die runInteraction() -Methode zu konvertieren, aber ich bin mir nicht sicher, ob ich es richtig mache.

class InteractionHandler(cyclone.web.RequestHandler): 
    @cyclone.web.asynchronous 
    def get(self, *args, **kwargs): 
     d = conn.runInteraction(self.someTransaction) 
     d.addCallback(self.done) 

    def someTransaction(self, txn): 
     txn.execute("INSERT INTO Table1 (Field1, Field2) VALUES ('a', 'b')") 
     txn.execute("UPDATE Table1 SET Field1 = 'c'") 
     txn.execute("UPDATE Table1 SET Field1 = 'd'") 

     raise Exception("rollback") 

    def done(self, rows): 
     print rows 
     self.finish("done") 

In diesem Fall habe ich den Effekt, den ich in der alles will zurückgerollt, aber wie Sie den Code sehen können, ist ganz anders. Anstatt Callbacks miteinander zu verketten, wo jeder Callback eine Abfrage ausführt, führe ich einfach alles in einer einzigen großen Methode aus.

Wie muss dies geschehen, um Transaktionen zu unterstützen?

Hier sind Links zu der Dokumentation:

http://twistedmatrix.com/documents/current/core/howto/rdbms.html

http://twistedmatrix.com/documents/12.0.0/api/twisted.enterprise.adbapi.ConnectionPool.html#runInteraction

Antwort

4

Ja. Ihr runInteraction -basiertes Neuschreiben ist korrekt.

+0

Danke für die Eingabe! – d512