2

在庫システムを作成していますが、sqlalchemy (postgresql) とトランザクション/セッションについていくつか質問があります。これは TG2 を使用する Web アプリです。これが重要かどうかはわかりませんが、多くの情報は決して悪いことではありません。

  1. 在庫数量を変更するときに競合状態にならないようにするにはどうすればよいですか。ユーザーがアイテムの在庫を 0 に減分しようとしていて、ユーザー 2 も在庫を 0 に減分しようとしている場合、それを正しく理解している場合、ユーザー 1 のセッションがまだコミットされていない場合、ユーザー 2 の開始在庫番号は次のようになります。ユーザーのものと同じになると、両方がコミットされたときに競合状態になり、複合効果を持つ代わりに一方が他方を上書きします。

  2. 注文番号や請求書番号などに postgresql シーケンスを使用したい場合、競合状態にならずに sqlalchemy から次の値を取得/設定するにはどうすればよいですか?

編集:更新または共有に使用して、with_lockmodeを使用する必要がある解決策を見つけたと思います。私が間違っている場合は、より多くの回答や他の人が私を修正できるように、開いたままにします.

ティア

4

2 に答える 2

3

2 つのトランザクションが同時に同じ値を設定しようとすると、そのうちの 1 つが失敗します。負けた方はエラー処理が必要です。特定の例では、部品の数を照会し、同じトランザクションで部品の数を更新する必要があります。

シーケンス番号に競合状態はありません。DB が自動的に割り当てるシーケンス番号を使用するレコードを保存します。

編集:

Limscoder が指摘しているように、分離レベルを Repeatable Read に設定する必要があることに注意してください。

于 2012-06-14T13:31:54.010 に答える
1

話しているシナリオをセットアップし、構成がそれをどのように処理するかを確認します。テストするには、2 つの別々の接続を開くだけです。

FOR UPDATE For Updateおよびトランザクション分離レベルIsolation Levelも参照してください。

于 2012-06-14T16:09:12.857 に答える