Как можно заблокировать любые действия со строкой пока существует сессия в SQLAlchemy?

Есть таблица в БД PostgreSQL с полем JSONB

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

Но, заметил такую особенность, что если несколько запросов приходят друг за другом, то видимо происходит перезатирание строки на одно из значений, которое было в промежутке.

Как это выглядит: Предположим в БД ксть запись:

{"k0": "v0"}

Далее с клиента идут записи новых ключе {"k1: "v1"}, {"k2: "v2"} ... Вот что показывают логи:

Обновляем {"k0": "v0"} значением {"k1: "v1"}
Новое значение: {"k0": "v0", "k1: "v1"}

Обновляем {"k0": "v0"} значением {"k2: "v2"}
Новое значение: {"k0": "v0", "k2: "v2"}

...

Не сложно догадаться, что запросы клиент сделал асинхронными и получил в моменте 1 значение и не может получить обновленного, в итоге в запись БД пойдет по принципу кто последний тот и папа

Пробовал и через менеджер контекста:

from sqlalchemy import update, create_engine

@contextmanager
def db_session():
    session = sessionmaker(bind=create_engine(SQLALCHEMY_DATABASE_URL))
    session = session()
    try:
        yield session
    except Exception as e:
        raise e
    finally:
        session.close()



with db_session() as session_db:
    field_json= session_db.query(model_table).filter_by(id=id_row).first().field_json
    if field_jsonis None:
        field_json= {}
    field_json.update(new_key_val)
    query = update(model_table).where(model_table.id=id_row).values(**field_json)
    session_db.execute(query)
    session_db.commit()

Но все попытки тщетны. Соответственно сам вопрос - можно ли заблокировать действия с таблицей в SQLAlchemy пока выполняется сессия?


Ответы (0 шт):