2011-09-14 4 views
5

以下はこの分離レベルでREPEATABLE READSデータベーストランザクションの異なる分離レベルに関するいくつかの説明?

についてWikipedia's Isolation articleから書かれた文で、ロックベースの並行性制御DBMSインプリメンテーションを読み出してトランザクションが終了するまで(選択されたデータに取得した) ロックを書き込み続けます。ただし、レンジロックは管理されていないため、ファントムリード現象が発生する可能性があります(下記参照)。

私の質問はここでいつ取引が始まり、終わりですか?

私たちは私の理解あたりtrnsaction 1は、最初のクエリが発射されるとき、すなわちSELECT * FROM users WHERE id = 1. DBMSがするまで、ユーザーテーブルにロックを維持します を始めるようREPEATABLEは、同じリンクでの分離レベルを読み込んで非反復性の例が読み取る場合トランザクションが終了しない限り ここに最後に私は、接続がロールバックされるか、SELECT * FROM users WHERE id = 1の完了時にコミットされないことを意味します。その時まで トランザクション2は待つでしょうか?


質問2: - 今すぐ(同じリンクで)下に与えられたとして、我々は分離レベルとthier行動を考慮すれば

Isolation level  Dirty reads Non-repeatable Phantoms 
Read Uncommitted may occur  may occur  may occur 
Read Committed  -    may occur  may occur 
Repeatable Read  -    may occur  - 
Serializable  -    -    - 

私の理解あたりとして最も信頼性が直列化され、その後反復可能読み取り、その後、コミットを読むが、まだ私はコミットされた読み取りを使用してアプリケーションを見てきました。これは、シリアライザブルではシーケンシャルであり、 のトランザクションが別のトランザクションによるロックの解放を待たなければならないため、リードコミットと比較してシリアライザブルおよびリピータブルリードのパフォーマンスが であるからです。 したがって、すべての3つを最大限に活用するには、 レベルをSELECT FOR UPDATEで読み取りコミットを使用することができます(反復可能な読み取りを実現するため)。 私たちが望むならば、ファントムリードを達成する方法がわかりません。リードコミットの場合 分離レベル?

+0

がhttp://stackoverflow.com/questions/10935850/whenを参照してください。 'SELECT ... FOR UPDATE'の議論のための-to-use-select-for-update – Gili

+0

それではSELECT FOR UPDATEを使用してREAD COMMITEDとして分離レベルを使用することができます。これはDatanucleusのようなJDO永続性レイヤのアプローチです。これらは、トランザクションごとに「SELECT FOR UPDATE」を制御するメカニズムを提供します。私は、このアプローチが、「より低い」トランザクションタイプを使用するときに、シリアライズ可能なトランザクションロックメカニズムのメリットをもたらすと考えています。 – marcolopes

+0

"繰り返し不可能な"分離レベルのトランザクションで "Repeatable Read"が発生することはありますか?この記事では、テーブルが異なっています - http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html – naXa

答えて

6

オラクル社では、分離レベル「REPEATABLE READ」をサポートしていません。ただし、SQL Serverは、トランザクションが終了するまで(つまり、コミットまたはロールバックされるまで)、トランザクションによって選択されたすべての行にロックを設定します。したがって、正しいですが、これは実際に(ロックされたデータを更新している場合)他のトランザクションを待機させ、同時性に有害になる可能性があります。

質問2:はい、独立性レベルが高いほど、より多くのロックが解放されるのを待たなければならないため、並行トランザクションが悪化します。 SELECT FOR UPDATEを使用して、「すべての3つのうちで最高のものを得よう」という意味がわからないのは、SELECT FOR UPDATEが選択されたすべての行に行ロックを設定するためです。

そして最後に、ここではファントムのOracleのマニュアルからの引用だが読み取ります

トランザクションが検索条件を満たし、他のコミットされたトランザクションことを発見した行のセットを返すクエリを再実行[ファントムは、ときに発生する読み込み]条件を満たす行が追加されました。

たとえば、トランザクションは従業員の数を問い合せます。5分後に同じクエリが実行されましたが、別のユーザーが新しい雇用のレコードを挿入したため、数字が1増加しました。より多くのデータが以前よりも照会基準を満たしますが、ファジー読み取りとは異なり、以前に読み取られたデータは変更されません。


参考:

+0

「あなたが何を意味するのかよく分かりません。私がここで尋ねようとしていることは、オラクルで読み取りコミットされた隔離レベルを使用する場合、私たちはまだ反復不可能で幻想的な読書の問題を抱えているということです。最初のトランザクションの間に2番目のトランザクションがコミットすると、更新されたデータを取得する必要があるため、これらは正しい動作と見なされます。 –

+1

続き... 2番目の質問は、 oracleでコミットされた読んで、何か方法はありますか?私は、更新クエリのselectを使用する場合、反復可能な読み込みから保存することができます.Coorect? –

関連する問題