Een eenvoudige oplossing zou zijn om de gebruiker van de teller en winnaar in het spelmodel te plaatsen. U kunt dan select_for_update
. gebruiken om het record te vergrendelen:
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
Als onderdeel van dezelfde transactie kunt u ook Player
opnemen s-objecten, zodat u ook weet wie heeft geklikt en andere informatie volgt, maar zet daar niet het nummer en de winnaar. Om select_for_update
te gebruiken je moet postgresql_psycopg2
. gebruiken backend.
Bijwerken: Aangezien django autocommit standaard aanzet, moet je de bovenstaande code in atomaire transactie verpakken. Van django docs
Je kunt je uitzicht verfraaien met @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()