sql >> Databáze >  >> RDS >> PostgreSQL

Vyhýbání se závodním podmínkám, Django + Heroku + PostgreSQL

Jednoduchým řešením by bylo umístění počítadla a vítěze do herního modelu. Poté můžete použít select_for_update pro uzamčení záznamu:

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

V rámci stejné transakce můžete také zaznamenat Player s objekty, takže také víte, kdo klikl, a sledujte další informace, ale neuvádějte tam číslo a vítěze. Chcete-li použít select_for_update musíte použít postgresql_psycopg2 backend.

Aktualizace: Vzhledem k tomu, že django ve výchozím nastavení nastavilo autocommit, musíte výše uvedený kód zabalit do atomické transakce. Od django docs

Svůj pohled můžete ozdobit pomocí @transaction.atomic :

from django.db import transaction

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



  1. CASE in WHERE CLAUSE v MYSQL

  2. Jak vložíte velké bloby do Oracle 10G pomocí System.Data.OracleClient?

  3. EntityFramework 6.1.3 a MySQL DbFunctions.TruncateTime neexistuje?

  4. Získání poslední vložené hodnoty v Yii