2012-02-06 4 views
1

私は、Webアプリケーションのユーザ統計を更新しているバックグラウンドジョブを構築しています。ジョブは現在55〜60秒かかりますが、ジョブが実行されていると同時にユーザーが統計ページを読み込もうとするとどうなるか心配です。PostgreSQL + Rails並行性の明確化

2人のクライアントが同じ行(1つの更新と1つの読み込み)にアクセスしようとすると、トランザクションが明示的に開始されていないので、最初のものだけを待つだけです2番目は終了する。

これを正しく理解していると、私が発生する可能性が高いのは、行が更新されるのと同じ瞬間にユーザーが統計ページを読み込もうとする小さな確率であるということです。私がPostgresを明示的に設定しない限り、統計テーブル全体が55〜60秒の仕事の間にロックされているのではないでしょうか?

これは正しい解釈ですか?私が逃している他の要因はありますか?

(私はそれが上記のシナリオ上の任意のベアリングを有する念のレール部分を言及)

(また:PostgreSQLのバージョンが9.0.4である)

答えて

1

、トランザクション分離レベルに依存します。私があなたのケースを持っているならば、遅延を避けるダーティリードについて話しています。デフォルトの分離レベルを使用している場合、YES、Dirty Readは不可能です。 Readerは、更新されている行と同じ行を取得しようとするときだけ、ライターを待機します。

読み取りコミットは、PostgreSQLのデフォルトの分離レベルです。トランザクションがこの分離レベルで実行されると、SELECTクエリはクエリの開始前にコミットされたデータのみを認識します。

specs on ISOLATION