使用相同的SQLAlchemysession
对象执行的查询是否使用相同的底层连接?如果没有,有没有办法确保这一点?在
一些背景知识:我需要使用MySQL的命名锁特性,即GET_LOCK()
和{
为了让事情变得更好,我创建了这样一个“锁定”上下文:
@contextmanager
def mysql_named_lock(session, name, timeout):
"""Get a named mysql lock on a session
"""
lock = session.execute("SELECT GET_LOCK(:name, :timeout)",
name=name, timeout=timeout).scalar()
if lock:
try:
yield session
finally:
session.execute("SELECT RELEASE_LOCK(:name)", name=name)
else:
e = "Count not obtain named lock {} within {} sections".format(
name, timeout)
raise RuntimeError(e)
def my_critical_section(session):
with mysql_named_lock(session, __name__, 10) as lockedsession:
thing = lockedsession.query(MyStuff).one()
return thing
我要确保execute
中的两个execute
调用发生在同一个底层连接上,或者该连接是关闭的。在
我能不能假设这会“管用”呢,或者这里有什么需要我注意的?在
如果(a)您的会话是一个限定作用域的会话,并且(b)您以非并发方式使用它(相同的pid/线程),那么它将“正常工作”。如果您太偏执,请确保(断言)您通过使用相同的连接ID
另外,将session作为参数传递是没有意义的。初始化一次,在应用程序的全局范围内的某个地方,然后调用代码中的任何地方,您将获得相同的连接ID
相关问题 更多 >
编程相关推荐