sql >> Databasteknik >  >> RDS >> PostgreSQL

Undviker tävlingsförhållanden, Django + Heroku + PostgreSQL

En enkel lösning skulle vara att sätta räknaren och vinnaren i spelmodellen. Du kan sedan använda select_for_update för att låsa 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 av samma transaktion kan du också spela in Player s objekt så att du också vet vem som klickade och spåra annan info men lägg inte numret och vinnaren där. För att använda select_for_update du måste använda postgresql_psycopg2 backend.

Uppdatering: Eftersom django ställer in autocommit på som standard måste du slå in ovanstående kod i atomär transaktion. Från django docs

Du kan dekorera din vy med @transaction.atomic :

from django.db import transaction

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



  1. orderpost enligt anpassad arrayposition

  2. $wpdb->insert producerar dubblettpost '0-0' för nyckel '1'

  3. Filtrera bort MySQL-fråga i PHP

  4. Ordning efter sträng som börjar med Number - ActiveRecord