PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rennbedingungen vermeiden, Django + Heroku + PostgreSQL

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()