Как избежать действий конечного пользователя на основе устаревших данных в БД - PullRequest
0 голосов
/ 22 января 2019

У меня в базе данных есть таблица базы данных, в которой представлены различные предметы для продажи и их цены.Для простоты, давайте предположим, что схема для этого выглядит примерно так: -

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 $.

У меня есть два решения: -

  1. Исправьте API buyProduct(), чтобы включить цену, которая указывает, какая цена была показана конечному пользователю.Если цена продукта изменилась, выведите ошибку.

  2. Включите GUID для продуктов, который представляет версию строки продукта.Затем он переносится в браузер конечного пользователя (но не отображается для пользователя) и также указывается в buyProduct().Каждый раз, когда в таблицу «Продукты» вносится изменение в любую строку, GUID будет обновляться.buyProduct() будет гарантировать, что во время выполнения API GUID продукта должен соответствовать тому, что переносил API.

Я считаю, что <2> - это путь, так как дажеitem_count подвержен изменениям.Но так ли это все делают?Существует ли паттерн django для решения этой проблемы?

Только что понял, что заголовок E-Tag и заголовки Cache-Control в HTTP кажутся рекомендуемым способом избежать повреждения данных.Но действительно ли люди идут по этому пути?Я нашел ссылку об этом здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...