【问题标题】:Transaction support in twisted adbapi扭曲的 adbapi 中的事务支持
【发布时间】:2012-07-18 05:38:23
【问题描述】:

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

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

【问题讨论】:

    标签: python transactions twisted


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多