Как заставить SQLlite выбрать для поведения транзакции обновления в sqlalchemy

Вчера я работал с некоторыми материалами sqlalchemy, которым нужна концепция "выбрать... для обновления", чтобы избежать состояния гонки. Добавление .with_lockmode('update') в запрос работает с обработкой на InnoDB и Postgres, но для sqlite я в конечном итоге должен прокрасться в

if session.bind.name == 'sqlite':
    session.execute('begin immediate transaction')

перед выполнением выбора.

Кажется, сейчас это работает, но это похоже на обман. Есть ли лучший способ сделать это?

Ответы

Ответ 1

SELECT... FOR UPDATE OF... не поддерживается. Это понятно учитывая, что механика SQLite в этой строке блокирует избыточность поскольку вся база данных блокируется при обновлении любого ее бита. Однако, было бы хорошо, если бы будущая версия SQLite поддерживала его для SQL соображения взаимозависимости, если ничего другого. Единственная функциональность требуется обеспечить, чтобы в базе данных помещалась блокировка "ЗАПРАШИВАЕМАЯ", если еще нет.

выдержка из http://sqlite.org/cvstrac/wiki?p=UnsupportedSql

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