在多线程环境中使用 SQLAlchemy 执行事务

cod*_*er5 0 python postgresql sqlalchemy flask-sqlalchemy

我正在开发一个使用 Flask、SQLAlchemy 和 PostgreSQL 的应用程序。我必须编写一个在数据库上执行多个查询的事务。

def exec_query_1():
    with db.engine.connect() as connection:
        connection.execute(#some-query)

def exec_query_2():
    with db.engine.connect() as connection:
        connection.execute(#some-query)

def exec_query_3():
    with db.engine.connect() as connection:
        connection.execute(#some-query)

def execute_transaction():
    with db.engine.connect() as connection:
        with connection.begin() as transaction:
            exec_query_1()
            exec_query_2()
            exec_query_3()
Run Code Online (Sandbox Code Playgroud)

鉴于应用程序是多线程的,这段代码会按预期工作吗?如果是,怎么办?如果不是,那么使其发挥作用的正确方法是什么?

Ilj*_*ilä 5

即使在单线程中,代码也不会按预期工作。函数中打开的连接与1中使用的连接是分开的execute_transaction(),并且具有自己的事务。您应该安排代码,以便函数接收与正在进行的事务的连接作为参数:

def exec_query_1(connection):
    connection.execute(#some-query)

def exec_query_2(connection):
    connection.execute(#some-query)

def exec_query_3(connection):
    connection.execute(#some-query)

def execute_transaction():
    with db.engine.connect() as connection:
        with connection.begin() as transaction:
            exec_query_1(connection)
            exec_query_2(connection)
            exec_query_3(connection)
Run Code Online (Sandbox Code Playgroud)

请记住,连接不是线程安全的,因此不要在线程之间共享它们。“我什么时候构建一个会话,什么时候提交它,什么时候关闭它?” 是一本好书,虽然关于Session

1可能取决于池配置。