У меня в базе данных есть таблица базы данных, в которой представлены различные предметы для продажи и их цены.Для простоты, давайте предположим, что схема для этого выглядит примерно так: -
class Product(models.Model):
item_id = models.Integer()
item_name = models.CharField(max_length=30)
item_price = models.CharField(max_length=30)
item_count = models.Integer()
Существует API getProducts()
, который используется для показа конечному пользователю всех доступных продуктов,включая их цену.
Существует еще один API buyProduct(product_id)
, доступный для конечного пользователя, с помощью которого он может приобрести товар, увидев его цену.Существует третий API, updatePrice(product_id, new_price)
доступный для административного бэкэнда, с помощью которого можно изменить цену.
Теперь без транзакции базы данных, которая охватывает> 1 HTTP-запросов, как я могу гарантировать, чтоAPI buyProduct()
успешен только в том случае, если цена совпадает с тем, что видел конечный пользователь (в основном, то, что getProducts()
вернул браузеру последним).Вполне возможно, что покупатель видит цену продукта в 1 $ и нажимает кнопку «КУПИТЬ», но одновременно цена в бэкэнде была изменена на 2 $.
У меня есть два решения: -
Исправьте API buyProduct()
, чтобы включить цену, которая указывает, какая цена была показана конечному пользователю.Если цена продукта изменилась, выведите ошибку.
Включите GUID для продуктов, который представляет версию строки продукта.Затем он переносится в браузер конечного пользователя (но не отображается для пользователя) и также указывается в buyProduct()
.Каждый раз, когда в таблицу «Продукты» вносится изменение в любую строку, GUID будет обновляться.buyProduct()
будет гарантировать, что во время выполнения API GUID продукта должен соответствовать тому, что переносил API.
Я считаю, что <2> - это путь, так как дажеitem_count
подвержен изменениям.Но так ли это все делают?Существует ли паттерн django для решения этой проблемы?
Только что понял, что заголовок E-Tag и заголовки Cache-Control в HTTP кажутся рекомендуемым способом избежать повреждения данных.Но действительно ли люди идут по этому пути?Я нашел ссылку об этом здесь