1

株式市場をシミュレートするための単純な django アプリがあり、ユーザーが入って売買します。彼らが取引することを選択したとき、

  1. 市場価格が読み取られ、
  2. 買い/売り注文に基づいて、市場価格が増減します。

これがdjangoでどのように機能するかはわかりませんが、ビューをアトミックにする方法はありますか? つまり、ユーザー A のアクションが価格を読み取る可能性があることを懸念していますが、注文のために価格が更新される前に、ユーザー B のアクションが価格を読み取ります。

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

4

3 に答える 3

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

于 2009-07-20T19:57:18.673 に答える
-1

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

于 2009-07-20T19:43:43.287 に答える