SQLAlchemy会话和连接关系

2024-10-01 19:22:03 发布

您现在位置:Python中文网/ 问答频道 /正文

使用相同的SQLAlchemysession对象执行的查询是否使用相同的底层连接?如果没有,有没有办法确保这一点?在

一些背景知识:我需要使用MySQL的命名锁特性,即GET_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中的两个execute调用发生在同一个底层连接上,或者该连接是关闭的。在

我能不能假设这会“管用”呢,或者这里有什么需要我注意的?在


Tags: namelockexecutegetsessiondefmysqltimeout
1条回答
网友
1楼 · 发布于 2024-10-01 19:22:03

如果(a)您的会话是一个限定作用域的会话,并且(b)您以非并发方式使用它(相同的pid/线程),那么它将“正常工作”。如果您太偏执,请确保(断言)您通过使用相同的连接ID

session.connection().connection.thread_id()

另外,将session作为参数传递是没有意义的。初始化一次,在应用程序的全局范围内的某个地方,然后调用代码中的任何地方,您将获得相同的连接ID

相关问题 更多 >

    热门问题