Jednoduchým řešením by bylo umístění počítadla a vítěze do herního modelu. Poté můžete použít select_for_update
pro uzamčení záznamu:
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
V rámci stejné transakce můžete také zaznamenat Player
s objekty, takže také víte, kdo klikl, a sledujte další informace, ale neuvádějte tam číslo a vítěze. Chcete-li použít select_for_update
musíte použít postgresql_psycopg2
backend.
Aktualizace: Vzhledem k tomu, že django ve výchozím nastavení nastavilo autocommit, musíte výše uvedený kód zabalit do atomické transakce. Od django docs
Svůj pohled můžete ozdobit pomocí @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()