Мы пишем систему инвентаризации, и у меня есть некоторые вопросы о sqlalchemy (postgresql) и транзакциях/сеансах. Это веб-приложение, использующее TG2, но не уверен, что это важно, но много информации никогда не бывает плохой.
Как можно убедиться, что при изменении инвентаря, который я не запускаю в условиях гонки. Если я правильно понимаю, если пользователь наступает, чтобы уменьшить инвентарь на предмет, чтобы сказать 0, а пользователь два также пытается уменьшить инвентарь до 0, то если сеанс пользователя 1 не был еще установлен, тогда пользователь начинает два начального инвентарного номера быть таким же, как пользовательский, приводящий к условию гонки, когда оба фиксируют, один переписывает другой, вместо того, чтобы иметь составной эффект.
Если бы я хотел использовать последовательность postgresql для таких вещей, как номера заказов/счетов, как я могу получить/установить следующие значения из sqlalchemy без использования условий гонки?
EDIT: Я думаю, что нашел решение, которое мне нужно использовать with_lockmode, используя для обновления или для совместного использования. Я собираюсь оставить открытым для получения дополнительных ответов или для других, чтобы исправить меня, если я ошибаюсь.
ТИА
Если две транзакции пытаются установить одно и то же значение одновременно, один из них будет терпеть неудачу. Те, кто проигрывает, нуждаются в обработке ошибок. В вашем конкретном примере вы захотите запросить количество деталей и обновить количество деталей в одной транзакции.
На порядковых номерах нет условия гонки. Сохраните запись, в которой используется порядковый номер, который DB автоматически назначит.
Edit:
Обратите внимание, что, поскольку Limscoder указывает, вам необходимо установить уровень изоляции в Повторяемое чтение.
Установите сценарий, о котором вы говорите, и посмотрите, как его обрабатывает ваша конфигурация. Просто откройте два отдельных соединения, чтобы проверить его.
Также прочитайте в разделе FOR UPDATE "Обновить" , а также уровень изоляции транзакции Уровень изоляции