このarticaleによると、シリアル化可能な分離レベルは、行に対して読み取りロックと範囲ロックを実行します。したがって、あるトランザクションSELECT
でいくつかの行(または行)に対してステートメントを実行すると、同じ行(またはその行のサブセット)をクエリしようとする別のトランザクションは、最初のトランザクションがコミットまたはロールバックするまでロックされます。右?しかし、オラクルではそのようなシナリオを実行しようとしましたが、2番目のトランザクションはロックされていません。最初のトランザクションでコミットを実行するまでロックされないのはなぜですか?
3289 次
2 に答える
2
Oracleはマルチバージョン化を採用して、書き込みをブロックせずに読み取りの整合性を保証します。
読み取り一貫性のあるクエリ
クエリによって返されるデータはコミットされ、単一の時点に関して一貫性があります。
ノンブロッキングクエリ
データのリーダーとライターは互いにブロックしません
Read-Committed分離でSELECTを実行すると、データベースはクエリの開始時と同じように行を再構築するため、データの一貫したビューが得られます(すべてのブロックが同じ時点で取得されます)。Oracleは、元に戻るデータを使用して、クエリの開始後にブロックに加えられた変更(他のコミットされていないトランザクションからの変更も)を元に戻します。
原則は、Oracleがトランザクションの開始時と同じように行を再構築することを除いて、シリアル化可能なトランザクション分離と同じです。
詳細については、 TomKyteの本の1つにある「 Multi-VersioningandConcurrency 」の章を参照することをお勧めします。
于 2012-03-19T09:50:47.147 に答える
0
Oracleは読み取りロックを取得しません。彼らはCRメカニズムを持っています。
于 2012-03-19T03:59:11.887 に答える