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
Dzięki za wejście! – d512