Выбор ответа Senior SQLAlchemy 2.0 обновлено

Блокировка строки в SQLAlchemy

Вопрос

Как в SQLAlchemy 2.0 заблокировать строку счёта до конца транзакции перед списанием?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: select(Account).where(...).withforupdate(). withforupdate() добавляет SELECT ...

Варианты ответа

  1. session.lock(Account, id) перед изменением
  2. session.query(Account).lock().get(id)
  3. session.get(Account, id, lock=True) в транзакции
  4. select(Account).where(...).with_for_update()правильный ответ

Разбор

with_for_update() добавляет SELECT ... FOR UPDATE, и параллельные транзакции, желающие изменить строку, ждут коммита. Параметры nowait=True и skip_locked=True меняют поведение ожидания. У session.get есть параметр with_for_update, но не lock, а методов session.lock и query.lock нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме