sql >> Database >  >> RDS >> PostgreSQL

Race-omstandigheden vermijden, Django + Heroku + PostgreSQL

Een eenvoudige oplossing zou zijn om de gebruiker van de teller en winnaar in het spelmodel te plaatsen. U kunt dan select_for_update . gebruiken om het record te vergrendelen:

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 onderdeel van dezelfde transactie kunt u ook Player opnemen s-objecten, zodat u ook weet wie heeft geklikt en andere informatie volgt, maar zet daar niet het nummer en de winnaar. Om select_for_update te gebruiken je moet postgresql_psycopg2 . gebruiken backend.

Bijwerken: Aangezien django autocommit standaard aanzet, moet je de bovenstaande code in atomaire transactie verpakken. Van django docs

Je kunt je uitzicht verfraaien met @transaction.atomic :

from django.db import transaction

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



  1. Voeg BLOB-testreeks in die groter is dan 2000 of 4000 bytes

  2. Weeknummer van een datum halen in MS SQL Server 2005?

  3. SQLAlchemy - SQLite voor testen en Postgresql voor ontwikkeling - Hoe overzetten?

  4. Waarschuwing:mysqli_connect():(HY000/1049):Onbekende database alleen in mac-terminal