Prostym rozwiązaniem byłoby umieszczenie licznika i zwycięzcy w modelu Game. Następnie możesz użyć select_for_update
aby zablokować rekord:
game = Game.objects.select_for_update().get(pk=gamepk)
if game.number + 1 == X
# he is a winner
game.winner = request.user
game.number = game.number + 1
game.save()
else:
# u might need to stop the game if a winner already decided
W ramach tej samej transakcji możesz również zarejestrować Player
s obiekty, dzięki czemu wiesz, kto kliknął i śledzi inne informacje, ale nie umieszczaj tam liczby i zwycięzcy. Aby użyć select_for_update
musisz użyć postgresql_psycopg2
backend.
Aktualizacja: Ponieważ django domyślnie włącza autocommit, musisz umieścić powyższy kod w transakcji atomowej. Z django dokumenty
Możesz ozdobić swój widok za pomocą @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()