En simpel løsning ville være at sætte tælleren og vinderbrugeren i spilmodellen. Du kan derefter bruge select_for_update
for at låse 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 af den samme transaktion kan du også optage Player
s objekter, så du også ved, hvem der klikkede og spor andre oplysninger, men sæt ikke nummeret og vinderen der. For at bruge select_for_update
du skal bruge postgresql_psycopg2
backend.
Opdatering: Da django har sat autocommit til som standard, skal du indpakke ovenstående kode i atomtransaktion. Fra django docs
Du kan dekorere din udsigt med @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()