9

PostgreSQL 9.1(または9.2)で実行される次のクエリについて考えてみます。

SELECT * FROM foo WHERE bar = true

かなり長時間実行されるクエリだとします(たとえば、1分かかります)。

クエリの開始時に保持されるレコードが500万件ありbar = true、別のトランザクションでのこのクエリ中にテーブルに追加および削除された行がfooあり、一部の既存の行についてはbarフィールドが更新されます。

これは、上記の選択クエリの結果に影響しますか?

単一のトランザクション内の個別のステートメント間のトランザクション分離と可視性については知っていますが、実行中の単一のステートメントについてはどうでしょうか。

4

2 に答える 2

10

いいえ
。MVCC モデルにより、クエリの開始時に表示されるタプルのみが単一の .xml で使用されますSELECTここのマニュアルの詳細:

Read Committed は、PostgreSQL のデフォルトの分離レベルです。トランザクションがこの分離レベルを使用する場合、SELECT クエリ (FOR UPDATE/SHARE 句なし) は、クエリが開始される前にコミットされたデータのみを参照します。 並行トランザクションによるクエリ実行中にコミットされていないデータや変更がコミットされることはありません。実際、SELECT クエリは、クエリの実行が開始された時点でのデータベースのスナップショットを参照します。ただし、SELECT は、まだコミットされていなくても、自身のトランザクション内で実行された以前の更新の影響を確認します。また、2 つの連続する SELECT コマンドは、最初の SELECT の実行中に他のトランザクションが変更をコミットした場合、それらが 1 つのトランザクション内にある場合でも、異なるデータを参照できることに注意してください。

鉱山を強調します。

于 2012-08-24T13:38:27.653 に答える
5

クエリは、クエリの開始時点でデータの読み取り一貫性のあるビューになります。Postgresql では、Multi-Version Concurrency Control (MVCC) に関するドキュメントで、その方法が説明されています (レコードの複数のバージョンがテーブルに存在します)。Oracle では、Sequence Change Number (SCN) が、変更されたデータの「変更前イメージ」とともに使用されます。これは、 「非上書きストレージ管理」セクションを含む古いドキュメント、Transaction Processing in Postgresqlです。しかし、MVCCを見てください。

または、Postgresql doc のMVCCに関する章を読んでください。

于 2012-08-24T13:38:40.417 に答える