PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Избягване на състезателни условия, Django + Heroku + PostgreSQL

Едно просто решение би било да поставите брояча и победителя в модела на играта. След това можете да използвате select_for_update за да заключите записа:

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

Като част от същата транзакция можете също да запишете Player s обекти, така че да знаете също кой е кликнал и да проследите друга информация, но не поставяйте номера и победителя там. За да използвате select_for_update трябва да използвате postgresql_psycopg2 бекенд.

Актуализация: Тъй като django е включил autocommit по подразбиране, трябва да обвиете горния код в атомна транзакция. От django docs

Можете да украсите своя изглед с @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 - получава най-близкия ред за дата и час спрямо дадена стойност за дата и час

  2. дублираната стойност на ключ нарушава уникалното ограничение - postgres грешка при опит за създаване на sql таблица от dask dataframe

  3. „Твърде много връзки“, създадени в postgres при създаване на табло за управление в Pentaho

  4. Как да използвам същия списък два пъти в клаузата WHERE?

  5. Как да създам миграция на релси, за да премахна/променя прецизността и мащаба на десетичната система?