gpt4 book ai didi

python - 非阻塞客户端中的事务?

转载 作者:行者123 更新时间:2023-11-29 12:22:25 25 4
gpt4 key购买 nike

我们正在使用 momoko并在 Tornado 应用程序中具有以下与数据库异步连接的标准设置:

class BaseHandler(tornado.web.RequestHandler):
@property
def db(self):
# Create a database connection when a request handler is called
# and store the connection in the application object.
if not hasattr(self.application, 'db'):
self.application.db = momoko.AsyncClient({
'host': 'localhost',
'database': 'momoko',
'user': 'frank',
'password': '',
'min_conn': 1,
'max_conn': 20,
'cleanup_timeout': 10
})
return self.application.db

有一天,我发现像这样的代码,会阻塞应用程序:

fail = yield gen.Task(self.db.execute, 'BEGIN; SELECT * FROM non_existing_table; END;')

首先想到的是:

try:
fail = yield gen.Task(self.db.execute, 'BEGIN; SELECT * FROM non_existing_table; END;')
except:
reconnect()

在深入研究之后,我发现这样做会更好:

try:
fail = yield gen.Task(self.db.execute, 'BEGIN; SELECT * FROM non_existing_table; END;')
except:
yield gen.Task(self.db.execute, 'ROLLBACK;')

最后,在探索 source code 之后我发现 momoko,最好使用阻塞客户端进行交易。

于是BaseHandler转化为:

class BaseHandler(tornado.web.RequestHandler):
@property
def db(self):
# Create a database connection when a request handler is called
# and store the connection in the application object.
if not hasattr(self.application, 'db'):
self.application.db = momoko.AsyncClient({
'host': 'localhost',
'database': 'momoko',
'user': 'frank',
'password': '',
'min_conn': 1,
'max_conn': 20,
'cleanup_timeout': 10
})
return self.application.db

@property
def bdb(self):
# Create a database connection when a request handler is called
# and store the connection in the application object.
if not hasattr(self.application, 'bdb'):
self.application.bdb = momoko.BlockingClient({
'host': 'localhost',
'database': 'momoko',
'user': 'frank',
'password': '',
'min_conn': 1,
'max_conn': 20,
'cleanup_timeout': 10
})
return self.application.bdb

现在我的问题是……在AsyncClient 中使用事务有什么安全的方法吗?或者 AsyncClient 通常用于从数据库读取,而不是用于写入/更新数据?

最佳答案

我正在开发 Momoko 1.0.0,我刚刚发布了第一个测试版。交易是新功能之一。这是我在邮件列表上的帖子:https://groups.google.com/forum/?fromgroups=#!topic/python-tornado/7TpxBQvbHZM

1.0.0 之前的版本不支持事务,因为每次你运行 execute 时,AsyncClient 有可能会为你选择一个新的连接,而你不会如果出现任何问题,能够回滚您的交易。

希望对您有所帮助。 :)

关于python - 非阻塞客户端中的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674384/

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