http://www.postgresql.org/docs/9.1/static/transaction-iso.html Read Committed IsolationLevelに関するドキュメントには次のように書かれています。
Read Committedは、PostgreSQLのデフォルトの分離レベルです。トランザクションがこの分離レベルを使用する場合、SELECTクエリ(FOR UPDATE / SHARE句なし)は、クエリが開始される前にコミットされたデータのみを参照します。コミットされていないデータや、並行トランザクションによるクエリの実行中にコミットされた変更は表示されません。実際、SELECTクエリは、クエリの実行が開始された時点でのデータベースのスナップショットを参照します。ただし、SELECTは、まだコミットされていなくても、自身のトランザクション内で実行された以前の更新の影響を確認します。また、最初のSELECTの実行中に他のトランザクションが変更をコミットした場合、2つの連続するSELECTコマンドは、単一のトランザクション内にある場合でも、異なるデータを表示できることに注意してください。
最後の文は私を混乱させます、それはどういう意味ですか?トランザクションで2つの選択がなく、3つの選択があり、それらの間にDMLを使用せずにいくつかの計算がある場合はどうなりますか?すべての選択は、すべてのクエリの開始時に独自のスナップショットを表示しますか?
最後の文はこの状況を示しています。
foo
両方のトランザクションが開始する前に1つの行を含むテーブルがあると仮定します。
トランザクション1トランザクション2 ---------------------------------------------- --------- トランザクションを開始します。 select * from foo; -> トランザクションを開始する1行を返します。 foo値に挿入します(2); コミット; select * from foo; -> 2行を返すようになりました
(最初の選択後、トランザクション1はコミットされていないことに注意してください)
トランザクション1で新しい(コミットされた)行を表示したくない場合は、「繰り返し可能な読み取り」と呼ばれる分離レベルを使用する必要があります。この名前は、同じクエリを何度も繰り返すことができ、同じデータが繰り返し表示されるという事実に由来しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加