PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Unikanie wyścigów, Django + Heroku + PostgreSQL

Prostym rozwiązaniem byłoby umieszczenie licznika i zwycięzcy w modelu Game. Następnie możesz użyć select_for_update aby zablokować rekord:

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

W ramach tej samej transakcji możesz również zarejestrować Player s obiekty, dzięki czemu wiesz, kto kliknął i śledzi inne informacje, ale nie umieszczaj tam liczby i zwycięzcy. Aby użyć select_for_update musisz użyć postgresql_psycopg2 backend.

Aktualizacja: Ponieważ django domyślnie włącza autocommit, musisz umieścić powyższy kod w transakcji atomowej. Z django dokumenty

Możesz ozdobić swój widok za pomocą @transaction.atomic :

from django.db import transaction

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL, niestandardowe agregaty

  2. Tworzenie emacsa do domyślnego podświetlania składni postgresql

  3. Zarządzaj łączeniem połączeń w aplikacji internetowej dla wielu dzierżawców za pomocą Spring, Hibernate i C3P0

  4. Heroku nie migruje modeli w Django

  5. PostgreSQL round (v numeryczne, s int)