2012-07-18 69 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