2012-07-18 17 views
6

Sto cercando di capire come funzionano le transazioni nel modulo adbapi di Twisted. Attualmente sto usando runOperation() per eseguire le istruzioni INSERT e UPDATE. La documentazione, che collegherò a quanto segue, fa sembrare che supporti le transazioni, ma non sembra nel modo che vorrei. Ecco qualche esempio di codice (la sua esecuzione all'interno di un web server ciclone, ma si spera che non è rilevante):Supporto per le transazioni in adbapi twistato

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 questo caso, anche se viene sollevata un'eccezione nell'ultimo richiamata, sia l'istruzione INSERT e UPDATE vengono eseguiti . Non quello che voglio.

Ho provato a convertire per utilizzare il metodo runInteraction(), ma non sono sicuro di farlo correttamente.

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 questo caso ottengo l'effetto che voglio in cui tutto viene eseguito il rollback, ma come si può vedere il codice è molto diversa. Invece di concatenare i callback insieme, in cui ogni callback esegue una query, eseguo semplicemente tutto in un unico grande metodo.

È il modo in cui questo deve essere fatto per supportare le transazioni?

Ecco i link alla documentazione:

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

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

risposta

4

Sì. La riscrittura basata su runInteraction è corretta.

+0

Grazie per l'input! – d512