Представьте себе эти два случая:
Первый случай
Веб-сайт, на котором пользователи могут арендовать автомобили друг с другом, поэтому представление, обрабатывающее бронирование, должно быть примерно таким:
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 товар
Затем последовал этот учебник , и я думаю, что это похоже на первый случай, следует ли мне использовать то, что было показано в первом случае?