簡単な解決策は、カウンターと勝者のユーザーをゲームモデルに入れることです。その後、select_for_update
を使用できます レコードをロックするには:
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
同じトランザクションの一部として、Player
を記録することもできます sオブジェクト。これにより、誰がクリックして他の情報を追跡したかがわかりますが、番号と勝者はそこに入れないでください。 select_for_update
を使用するには postgresql_psycopg2
を使用する必要があります バックエンド。
更新: djangoはデフォルトで自動コミットをオンに設定しているため、上記のコードをアトミックトランザクションでラップする必要があります。 django docs から
@transaction.atomic
でビューを装飾できます :
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()