accounts
すべてのユーザーの口座残高 (利用可能なお金) を格納する私の django プロジェクトにこのモデルがあります。ユーザーのアカウントからのほとんどすべての控除の前に、金額チェック、つまりユーザーが x の金額以上を持っているかどうかのチェックが行われます。はいの場合は、先に進んで金額を差し引いてください。
account = AccountDetails.objects.get(user=userid)
if int(account.amount) >= fare:
account.amount = account.amount-fare
account.save()
.get()
ここで、競合状態を回避できるように、最初のステートメントにロックを入れたいと思います。ユーザーがリクエストを 2 回行うと、アプリケーションは上記のコードを同時に 2 回実行し、一方のリクエストがもう一方のリクエストをオーバーライドします。
select_for_update()がまさに私が望むことを行うことがわかりました。トランザクションが終了するまで行をロックします。
account = AccountDetails.objects.select_for_update().get(user=userid)
しかし、これは Django 1.4 以降でしか利用できません。私はまだ Django 1.3 を使用しており、新しいバージョンに移行することは今のところできません。現在の Django バージョンでこれをどのように達成できますか?