以下はこの分離レベルで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
で読み取りコミットを使用することができます(反復可能な読み取りを実現するため)。 私たちが望むならば、ファントムリードを達成する方法がわかりません。リードコミットの場合 分離レベル?
がhttp://stackoverflow.com/questions/10935850/whenを参照してください。 'SELECT ... FOR UPDATE'の議論のための-to-use-select-for-update – Gili
それではSELECT FOR UPDATEを使用してREAD COMMITEDとして分離レベルを使用することができます。これはDatanucleusのようなJDO永続性レイヤのアプローチです。これらは、トランザクションごとに「SELECT FOR UPDATE」を制御するメカニズムを提供します。私は、このアプローチが、「より低い」トランザクションタイプを使用するときに、シリアライズ可能なトランザクションロックメカニズムのメリットをもたらすと考えています。 – marcolopes
"繰り返し不可能な"分離レベルのトランザクションで "Repeatable Read"が発生することはありますか?この記事では、テーブルが異なっています - http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html – naXa