Django должен ли я использовать select_for_update в моем представлении? - PullRequest
0 голосов
/ 08 мая 2020

Представьте себе эти два случая:

Первый случай

Веб-сайт, на котором пользователи могут арендовать автомобили друг с другом, поэтому представление, обрабатывающее бронирование, должно быть примерно таким:

def reservations(request, id):
    deal = Deal.objects.filter(id=id, available=True)
    # if not exist return error ...

    if request.method == 'POST':
        form = ReservationDealForm(request.POST)
        if form.is_valid():
            reservation = ReservationDeal()
            with transaction.atomic():
                reservation.check_in = form.cleaned_data['check_in']
                reservation.check_out = form.cleaned_data['check_out']
                # ...
                reservation.deal = deal[0]
                reservation.save()
                deal.update(available=False)  # We make the deal not available
                return redirect('index')

Второй случай

Веб-сайт электронной коммерции с представлением, который обрабатывает функцию добавления в корзину, должен выглядеть примерно так:

def add_to_cart(request, id):
    # ...
    quantity_request = form.cleaned_data.get('quantity')
    item = Item.objects.filter(id=id)
    with transaction.atomic():
        # decrease the stock
        item.stock -= F('stock') - quantity_request
        item.save()
        # create an order item for the user or if 
        # he has an order item we update only the quantity
        order_item = OrderItem.objects.create(user=request.user, item=item, quantity=quantity_request)
    # ...

Мои вопросы:

Что произойдет в первом случае, если два человека на веб-сайте одновременно нажмут «зарезервировать машину» для доступной машины? Может случиться так, что оба запроса действительны? transaction.atomic гарантия, что этого не произойдет, или мне следует использовать select_for_update?

Для второго случая те же вопросы, что и выше, но предположим, что до запроса на складе остался только 1 товар

Затем последовал этот учебник , и я думаю, что это похоже на первый случай, следует ли мне использовать то, что было показано в первом случае?

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