Как можно заблокировать любые действия со строкой пока существует сессия в 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 пока выполняется сессия?