2009-07-20 7 views
1

私は株式市場をシミュレートするためのシンプルなジャンゴアプリを持っています、ユーザーは来て、買う/売る。彼らは取引を選択すると、Django、ビューアトミックを作成する方法は?

  1. 市場価格が読み込まれ、
  2. は、市場価格が上昇している買い/売り注文に基づいている/減少しました。

これはdjangoでどのように動作するのか分かりませんが、ビューをアトミックにする方法はありますか?すなわち、ユーザAの行動が価格を読むことができると懸念しているが、注文のために更新される前に、ユーザBの行動は価格を読み取る。

オンラインではシンプルでクリーンなソリューションが見つかりませんでした。ありがとう。

+0

ユーザーAがページを読んで、意思決定をするために10分かかる場合はどうなりますか?ユーザーBは注文を許可する必要がありますか? –

+0

データベーストランザクションはアトミックであり、Webサーバーのページビューではありません。 2人のユーザーの独立した要求をシリアル化することはあまりありません。 –

答えて

-1

トランザクションで更新されたDBクエリと更新されたクエリをラップします。構文は、使用しているORMによって異なります。

+1

これはPostgreSQLでは正しくありません。トランザクション内の行を読み取るとトランザクションがロックされることは想定できません。 –

1

これはデータベーストランザクションであり、いくつかの注意事項があります。 Postgresqlのすべての注釈。すべてのデータベースにロック機構がありますが、詳細は異なります。

多くのデータベースでは、トランザクション中であっても、デフォルトでこのレベルのロックは行われません。データを明示的にロックする必要があります。

PostgreSQLでは、SELECT ... FOR UPDATEが必要になります。これは返された行をロックします。別のユーザーがそれらを更新しようとしている場合、ブロックするすべてのSELECTに対してFOR UPDATEを使用する必要があります。

残念ながら、DjangoのORMでFOR UPDATEを実行する方法はありません。私が知る限り、ORMをハックするか、生のSQLを使用する必要があります。これがパフォーマンスの低いコードで、すべてテーブルへのアクセスをシリアル化する余裕がある場合は、テーブルレベルのLOCK IN EXCLUSIVE MODEを使用してテーブル全体をシリアル化します。

http://www.postgresql.org/docs/current/static/explicit-locking.html

http://www.postgresql.org/docs/current/static/sql-lock.html

http://www.postgresql.org/docs/current/static/sql-select.html

+1

ORMは、SQLの代用としてでも、SQLを避けるためのものでもないので、この種のものを手書きしても問題ありません。 – aehlke

+1

いいえ、うまくありません。特殊な ".select_for_update()"メソッドを使用する代わりに、 ".select_mode( 'FOR UPDATE')をQuerySetに追加するなど、直接的な作業を少しずつ行う必要があります。あなたがフラグを追加する必要があるからといって、*手全体で*書かなければならないか、そうでなければジャンプする必要があることは全く受け入れられません。 DjangoのORMはこの種のものではまだかなり未成熟です。 –

+0

(もちろん、ORMの語彙の外側にある複雑で特殊なクエリについては言及していません。) –

0

かなり古い質問が、1.6以来、あなたはデコレータとしてtransaction.atomic()使用することができます。

views.py

@transaction.atomic() 
def stock_action(request): 
    #trade here