gpt4 book ai didi

python - twisted adbapi 中的事务支持

转载 作者:太空狗 更新时间:2023-10-30 00:08:01 24 4
gpt4 key购买 nike

我正在尝试弄清楚事务在 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() 方法,但我不确定我是否正确地进行了转换。

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

最佳答案

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

关于python - twisted adbapi 中的事务支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com