Я прочитал документы: https://docs.djangoproject.com/en/3.0/topics/db/transactions/
Но мне не ясно, может ли транзакция охватывать HTTP-запросы.
Идея достаточно проста:
- пользователь отправляет форму
- backend then
- opens a transaction
- сохраняет данные
- представляет пользователю форму подтверждения
- затем пользователь подтверждает или отменяет
- бэкэнд затем фиксируется при подтверждении или откатывается при отмене
Основная проблема заключается в том, что транзакция открывается по HTTP-запросу, затем ожидается ответ пользователя (если он никогда не получен, я думаю, по истечении времени мы откатимся), и когда он поступит на второй HTTP-запрос, транзакция преданный идее.
Я не вижу ничего, описывающего такой вариант использования в документации, и ничего не нашел в сети. Тем не менее, это может показаться мне довольно обычным вариантом использования. Это возникает в первую очередь из-за того, что представление является сложным, включает в себя множество моделей и отношений, и самый простой (почти единственный разумный или разумный) способ изучить влияние представленных материалов - это сохранить все их, а затем изучить влияние. Это прекрасно работает, но до сих пор меня заставляли принимать решение о фиксации или откате в одном запросе при обработке формы. Теперь я хотел бы передать свой анализ пользователю и попросить его подтвердить, прежде чем я сделаю коммит!
Мне кажется, что второй запрос должен знать, к какой транзакции относится подтверждение, и определить, открыта ли эта транзакция, а затем зафиксировать ее или откатить. Это добавляет целый уровень идентификации транзакции, который я не вижу в документации Django.
Поддержка базы данных:
Интересный Postgresql может поддерживать это, пока вся транзакция принадлежит одному сеансу (подключению к базе данных), как я подозреваю, что и другие базы данных. Таким образом, это означает, что он может работать только в том случае, если сохранение выполняется постоянным демоном, который может запустить транзакцию и продолжать работу до тех пор, пока транзакция не будет подтверждена и зафиксирована или откат.
Возникает дополнительный вопрос, предоставляет ли Django такую возможность. Я подозреваю, что нет. Я подозреваю, что постоянные воркеры являются прерогативой uWsgi и / или Celery. И постоянный демон, который удерживает соединение с базой данных в ожидании запроса подтверждения, я подозреваю, называется менеджером транзакций.
И поэтому этот вопрос действительно становится более кратким: есть ли простой / канонический способ реализации диспетчера транзакций для Django.