それはすべてISOLATION LEVEL
に依存します 設定しました。
このクエリで設定したものを確認できます:
select @@global.tx_isolation, @@session.tx_isolation;
さまざまな分離レベルを説明する前に、回避しようとしている問題について説明しましょう。
-
ダーティリード :まだ完了していないトランザクションのデータは、別のトランザクションによって読み取られます。
-
失われた更新 :2つのトランザクションがテーブルのエントリを並行して変更します。両方のトランザクションが終了すると、1つの変更のみが適用されます。
-
繰り返し不可の読み取り :読み取りを繰り返すと、異なる結果になります。
-
ファントムリード :トランザクション中に、別のトランザクションがテーブルエントリを追加または削除します。
次に、さまざまな分離レベルについて説明します。
コミットされていないものを読む :
この分離レベルでは、読み取り操作はあらゆる種類のロックを無視するため、上記の問題のいずれかが発生する可能性があります。
コミット済みを読む :
この分離レベルは、変更する必要のあるオブジェクトのトランザクション全体に書き込みロックを設定します。読み取りロックは、データの読み取り時にのみ設定されます。したがって、繰り返し不可能な読み取りとファントム読み取りが発生する可能性があります。
繰り返し読む :
この分離レベルでは、パラメーターが同じ場合に、繰り返し発生する読み取り操作で常に同じ結果が得られることが保証されます。トランザクションの合計期間中、読み取りおよび書き込み操作にロックが設定されます。したがって、ファントム読み取りのみが発生する可能性があります。
シリアル化可能 :
最高の分離レベルは、並列実行トランザクションの結果が、トランザクションが次々に実行される場合と同じであることを保証します。ほとんどのデータベースは、実際にはこれらのトランザクションを次々に実行しません。パフォーマンスが大幅に低下します。したがって、1つのトランザクションが中止される可能性があります。たとえば、MySQLはMVCC(Multi-Version Concurrency Control)でこれを実現します。あなたがもっと知りたいなら、それをグーグルしてください。この答えには多すぎます。
全体として、この表はそれも説明しています:
| Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible | possible | possible | possible
Read Committed | impossible | impossible | possible | possible
Repeatable Read | impossible | impossible | impossible | possible
Serializable | impossible | impossible | impossible | impossible
- この
手動入力 それと分離レベルを設定する方法についての詳細です。
これはすべて、リレーショナルデータベース管理システムの理論にすぎません。ただし、MySQLはMVCC(マルチバージョン同時実行制御)を使用するため、InnoDBおよび反復可能な読み取り分離レベルを使用する場合はファントム読み取りは発生しません 。