是否使用相同的 SQLAlchemy 执行查询session
对象使用相同的底层连接?如果没有,有没有办法保证这一点?
一些背景:我需要使用 MySQL 的命名锁功能,即GET_LOCK()
and RELEASE_LOCK()
功能。就MySQL服务器而言,只有获得锁的连接才能释放锁——所以我必须确保要么在同一个连接中执行这两个命令,要么连接终止以确保锁被释放。
为了让事情变得更好,我创建了一个“锁定”上下文,如下所示:
@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
来电mysql_named_lock
发生在同一底层连接上或连接已关闭。
我可以假设这会“正常工作”还是有什么我需要注意的?
如果(a)您的会话是scoped_session并且(b)您以非并发方式(相同的pid/线程)使用它,它将“正常工作”。如果您太偏执,请确保(断言)您使用的是相同的连接 ID
session.connection().connection.thread_id()
此外,没有必要将会话作为参数传递。在应用程序全局范围内的某个位置初始化一次,然后在代码中的任何位置调用,您将获得相同的连接 ID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)