twisted adbapi中的事务支持

2024-04-29 03:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚事务在twisted的adbapi模块中是如何工作的。我目前正在使用runOperation()来执行INSERT和UPDATE语句。我将链接到下面的文档,使它看起来支持事务,但它似乎不像我希望的那样。下面是一些示例代码(它在cyclone 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")

在这种情况下,即使在最后一次回调中引发了异常,INSERT和UPDATE语句都会执行。不是我想要的。在

我尝试转换为使用runInteraction()方法,但我不确定是否正确地执行了该操作。在

^{pr2}$

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

为了支持交易,必须这样做吗?在

以下是指向文档的链接:

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

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


Tags: 代码文档selfweb链接deftwistedupdate