En enkel lösning skulle vara att sätta räknaren och vinnaren i spelmodellen. Du kan sedan använda select_for_update
för att låsa posten:
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
Som en del av samma transaktion kan du också spela in Player
s objekt så att du också vet vem som klickade och spåra annan info men lägg inte numret och vinnaren där. För att använda select_for_update
du måste använda postgresql_psycopg2
backend.
Uppdatering: Eftersom django ställer in autocommit på som standard måste du slå in ovanstående kod i atomär transaktion. Från django docs
Du kan dekorera din vy med @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()