扭曲的adbapi中的交易支持

d51*_*512 6 python transactions twisted

我试图弄清楚扭曲的adbapi模块中的事务是如何工作的.我目前正在使用runOperation()来执行INSERT和UPDATE语句.我将链接到下面的文档使它看起来支持事务,但它似乎并不像我想要的那样.这是一些示例代码(它在旋风web服务器中运行,但希望这不相关):

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")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,即使在最后一个回调中引发异常,也会执行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")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到了我想要的效果,其中所有内容都被回滚,但正如您所看到的,代码是完全不同的.而不是将回调链接在一起,每个回调运行一个查询,我只是在一个大方法中执行所有操作.

是否必须采取这种方式来支持交易?

以下是文档的链接:

http://twistedmatrix.com/documents/current/core/howto/rdbms.html

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

Jea*_*one 4

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