Выполнение транзакции с использованием SQLAlchemy в многопоточной среде - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над приложением, которое использует 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()

Учитывая, что приложение является многопоточным, будет ли этот код работать должным образом?Если да, то как?Если нет, какой будет правильный подход, чтобы заставить его работать?

1 Ответ

0 голосов
/ 17 октября 2018

Код не будет работать должным образом даже в одном потоке.Соединения, открытые в функциях, отделены 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)

Помните, что соединения не являются поточно-ориентированными, поэтому не делите их между потоками. «Когда я создаю сеанс, когда я его фиксирую и когда закрываю?» - хорошее чтение, хотя примерно Session.

1 Может зависеть от конфигурации пула.

...