Я работаю над проектом, в котором несколько конечных точек REST попадают на сервер Django из веб-клиента для создания данных. Если есть ошибка, иногда мы хотим удалить ранее созданные данные.
Например, если я создаю автомобиль с помощью POST /cars/
и хочу создать колеса через отдельную конечную точку с помощью POST /wheels/ { "car": 1 }
Я хочу удалить автомобиль, если я не смог добавить какие-либо колеса.
Создание конечных точек, которые выполняют все действия, которые мы можем откатить сразу (вместо того, чтобы использовать несколько конечных точек), потребует большого количества рефакторинга и на самом деле не вариант.
Что бы нам действительно понравилось, так это какой-то способ сделать что-то вроде этого:
POST /transaction/start
POST /cars/
POST /wheels/ { "car": 1 }
POST /transaction/end
Мы открываем транзакцию, присоединяем ее к сеансу пользователя, добавляем данные в эту транзакцию, затем закрываем транзакцию либо при достижении POST /transaction/end
, либо по истечении времени ожидания.
У меня есть два основных вопроса по этому поводу:
- Существуют ли какие-либо пакеты, которые делают это / это приемлемый шаблон? Я провел небольшое исследование и не увидел ничего специфического для django, но раньше видел конечные точки транзакции.
- Это серьезно блокирует базу данных? Области, где мы хотели бы сделать это, не так часто встречаются, так что это не такая уж большая проблема, но было бы неплохо знать.
Я немного покопался в @transaction.atomic
, и кажется, что это возможно, но мне пока не удалось это сделать. Я не уверен, имеет ли это значение, но мы используем postgres за кулисами. Любые советы будут оценены. Спасибо.