sql >> Database teknologi >  >> RDS >> PostgreSQL

Undgå løbsforhold, Django + Heroku + PostgreSQL

En simpel løsning ville være at sætte tælleren og vinderbrugeren i spilmodellen. Du kan derefter bruge select_for_update for at låse posten:

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

Som en del af den samme transaktion kan du også optage Player s objekter, så du også ved, hvem der klikkede og spor andre oplysninger, men sæt ikke nummeret og vinderen der. For at bruge select_for_update du skal bruge postgresql_psycopg2 backend.

Opdatering: Da django har sat autocommit til som standard, skal du indpakke ovenstående kode i atomtransaktion. Fra django docs

Du kan dekorere din udsigt med @transaction.atomic :

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()



  1. Sådan får du Android App til at kommunikere med ekstern MySQL db

  2. Transformering af to datarammer i spark sql

  3. PHP kan ikke lide denne T_String. (Uventet syntaksfejl T_STRING)

  4. Syntaksfejl i mysqldump-kommandoen