Estoy tratando de averiguar cómo funcionan las transacciones en el módulo adbapi de twisted. Actualmente estoy usando runOperation() para ejecutar instrucciones INSERT y UPDATE. La documentación, que voy a vincular a continuación, hace que parezca que admite transacciones, pero no parece en la forma que me gustaría. Aquí es un código de ejemplo (su funcionamiento dentro de un servidor web ciclón, pero es de esperar que no es relevante):Soporte de transacciones en adbapi trenzado
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")
En este caso, a pesar de que se produce una excepción en la última devolución de llamada, tanto la declaración de inserción y actualización son ejecutados . No es lo que quiero
Intenté convertir para utilizar el método runInteraction(), pero no estoy seguro de hacerlo correctamente.
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")
En este caso puedo obtener el efecto que quiero en la que todo se deshace, pero como se puede ver el código es bastante diferente. En lugar de encadenar devoluciones de llamadas juntas, donde cada devolución de llamada ejecuta una consulta, solo estoy ejecutando todo en un gran método.
¿Es la manera en que esto se debe hacer para respaldar las transacciones?
Éstos son enlaces a la documentación:
http://twistedmatrix.com/documents/current/core/howto/rdbms.html
Gracias por la entrada! – d512