Eine einfache Lösung wäre, den Zähler- und Gewinnerbenutzer in das Spielmodell aufzunehmen. Sie können dann select_for_update
verwenden um den Datensatz zu sperren:
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 Teil derselben Transaktion können Sie auch Player
aufzeichnen s-Objekte, damit Sie auch wissen, wer geklickt hat, und andere Informationen verfolgen können, aber geben Sie dort nicht die Nummer und den Gewinner an. Um select_for_update
zu verwenden Sie müssen postgresql_psycopg2
verwenden Backend.
Aktualisierung: Da Django standardmäßig Autocommit aktiviert hat, müssen Sie den obigen Code in eine atomare Transaktion einschließen. Von django docs
Sie können Ihre Ansicht mit @transaction.atomic
dekorieren :
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()