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はデフォルトで自動コミットをオンに設定しているため、上記のコードをアトミ​​ックトランザクションでラップする必要があります。 django docs から

    @transaction.atomicでビューを装飾できます :

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



    1. SQL開発者によるインデックス外の文字列

    2. ストアドプロシージャ-SQLDeveloper

    3. SQLでデータベースを作成するにはどうすればよいですか?

    4. plpgsqlでスキーマ変数を参照する方法