アプリに「Like / Unlike」システムを実装したいとします。後で並べ替えるために、それぞれのように数える必要があります。現在の値+1を挿入するだけでいいですか?単純すぎると思います。
2人のユーザーが同時にクリックした場合はどうなりますか?カウンターが邪魔されないようにするにはどうすればよいですか?
単純なデコレータでトランザクションを実装する必要があると読みました@transaction.atomic
が、これで問題を処理できるかどうか疑問に思います。
トランザクションは、1人のユーザーによってトリガーされる操作の「ブロック」を実行するように設計されていますが、私の場合、複数のリクエストを同時に処理し、カウンターを安全に更新できる必要があります。
何かアドバイスはありますか?
F()式を使用できます。
content.likes_count = F('likes_count') + 1
content.save()
したがって、操作はPythonではなくデータベースで実行されます。
djangoのドキュメントから。
F()のもう1つの便利な利点は、Pythonではなくデータベースでフィールドの値を更新することで競合状態が回避されることです。
2つのPythonスレッドが上記の最初の例のコードを実行する場合、一方のスレッドは、もう一方のスレッドがデータベースからフィールドの値を取得した後、フィールドの値を取得、インクリメント、および保存できます。2番目のスレッドが保存する値は、元の値に基づきます。最初のスレッドの作業は単に失われます。
データベースがフィールドの更新を担当している場合、プロセスはより堅牢になります。save()またはupdate()が実行されたときに、データベース内のフィールドの値に基づいてではなく、データベース内のフィールドの値に基づいてのみフィールドが更新されます。インスタンスが取得されたときの値。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加