MySQL имеет , недавно начал поддерживать NOWAIT для блокировки обновления на уровне записи. Это очень важно для обработки конфликта обновления, однако у меня возникают трудности при попытке реализовать его в моем веб-приложении (SQLQAlchemy / Flask с MySQL базой данных).
SQLAlchemy пока не поддерживает это для MySQL диалект (я использую pymysql
).
Мои спецификации c SQL ORM-выражение читает:
line = cs.query(BookLine).filter_by(my_id).with_for_update(nowait=True, skip_locked=True)
и генерирует SQL:
SELECT ... FROM bookline WHERE bookline.id = %(id_1)s FOR UPDATE
С этой указанной c записью, заблокированной другим сеансом, это SQL истечет время ожидания и завершится неудачей с неудовлетворительным взаимодействием с пользователем. В командной строке SQL с добавленным NOWAIT
завершается неудачно (правильно).
Как лучше всего с этим справиться? Или есть поддержка, исходящая от SQLAlchemy (даже на основе патчей)?
Опции, которые я вижу:
Обработка необработанных SQL с добавлением, что не является очень расширяемый для некоторых других конфликтных ситуаций, которые у меня есть.
Создание альтернативного диалекта с поддержкой этой функции (хотя у меня нет такого опыта).
- Исправьте существующий код диалекта, если это решение.