2012-07-18 47 views
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

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

回答

4

是。基于runInteraction的重写是正确的。

+0

感谢您的输入! – d512 2012-07-18 19:23:02