Я хочу убедиться, что два задания не пытаются обновить базу данных одновременно. Для достижения этой цели я использую консультативные блокировки на уровне сеанса Postgres. Когда задание запускается, оно создает сеанс и пытается получить блокировку на уровне сеанса. Если он не может получить блокировку (потому что другое задание удерживает эту блокировку), он завершает работу.
Этот код выглядит примерно так:
Код: Выделить всё
with sessionmaker(engine)() as session:
result = session.execute(
select(func.pg_try_advisory_lock("SOME_KEY"))
)
success = next(result)[0]
if not success:
sys.exit(1)
# at this point we have acquired the lock
# do the work
Чтобы обойти эту проблему, я создаю два сеанса:
Код: Выделить всё
with sessionmaker(engine)() as lock_session, sessionmaker(engine)() as work_session:
Это работает, но выглядит как уродливый хак. Могу ли я сделать что-то лучше?
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-activity
Мобильная версия