2012-07-18 7 views
6

Próbuję dowiedzieć się, jak transakcje działają w module adbapi firmy Twisted. Obecnie używam runOperation() w celu wykonania instrukcji INSERT i UPDATE. Dokumentacja, do której zamieszczę link poniżej, sprawia, że ​​wygląda na to, że obsługuje transakcje, ale nie wydaje się, by mi się to podobało. Oto przykładowy kod (ITS działa wewnątrz serwera WWW cyklonu, ale miejmy nadzieję, że nie jest istotne):Obsługa transakcji w skręconych wersjach 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") 

W tym przypadku, chociaż wyjątek jest podniesione w ostatnim zwrotnego, zarówno INSERT i UPDATE oświadczenia są wykonywane . Nie tego chcę.

Próbowałem przekonwertować, aby użyć metody runInteraction(), ale nie jestem pewien, czy robię to poprawnie.

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") 

W tym przypadku uzyskuję pożądany skutek, w którym wszystko zostaje wycofane, ale jak widać kod jest zupełnie inny. Zamiast łączenia połączeń zwrotnych, gdzie każde wywołanie zwrotne uruchamia jedno zapytanie, po prostu wykonuję wszystko w jedną wielką metodę.

Czy sposób, w jaki należy to zrobić, aby wspierać transakcje?

Oto linki do dokumentacji:

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

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

Odpowiedz

4

Tak. Twój przepisany na podstawie runInteraction jest poprawny.

+0

Dzięki za wejście! – d512

Powiązane problemy