6
我想弄清楚事务如何在扭曲的adbapi模块中工作。我目前使用runOperation()来执行INSERT和UPDATE语句。下面将链接到的文档使其看起来支持事务处理,但它似乎并不符合我的愿望。下面是一些示例代码(它的一个气旋的Web服务器中运行,但希望这是不相关):在扭曲的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")
在即使有异常,在过去的回调提出,无论是INSERT和UPDATE语句这种情况下被执行。不是我想要的。
我试着转换使用runInteraction()方法,但我不知道我做的是否正确。
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")
在这种情况下,我得到了我想要的一切它回滚的效果,但正如你所看到的代码是完全不同的。除了将回调链接在一起,每个回调都运行一个查询,我只是用一个大方法来执行所有的事情。
为了支持交易,这是必须完成的吗?
这里是链接到文件:
http://twistedmatrix.com/documents/current/core/howto/rdbms.html
感谢您的输入! – d512 2012-07-18 19:23:02