まず、ファントム読み取りは何ですか
多くの問い合わせの後、一貫性のない結果は、それがファントム読み取りと呼ばれている例数を設定し、トランザクションで。余分またはファントムラインと呼ばれるライン以下です。
(私は小さなパートナー検索からプログラミングを学びたいサークルTコミュニティに無料のビデオチュートリアルについて、より多くの業界関連の業界情報。ああ、絶対に無料!)
第二に、なぜファントム読み取りを解決する必要があります
高い並行性のデータベースシステムでは、トランザクションおよびトランザクション間の分離、ならびにトランザクション自体の整合性を確認する必要があります。
三、MySQLは読書の魔法を解決する方法であります
あなたはこの記事を参照している場合、私はあなたがダーティー読み取り、反復不能読み取り、再読み込みを知っていると仮定します。
1.マルチバージョン同時実行制御(MVCC)(スナップショットは一貫性をリード/リード)
ほとんどのデータベースには、複数バージョンの同時実行制御を実現するために、そして達成するために格納されたデータのスナップショットに依存しています。例えばInnoDBは、冗長ワードオフのすべての行を持ちます。
一つは、行のバージョンを作成することである行の削除(期限切れ)バージョンです。バージョン番号(trx_id)現在information_schema.INNODB_TRXテーブル。各トランザクション増分の開口部とバージョン番号(trx_id)。
トランザクションは、データがデータ・トランザクションの現在のバージョンと同様に、古いバージョンよりも低いバージョンを作成するのにかかるかかるたびに、データの現在のバージョンよりも大きくなっています。
共通するのは、スナップショットが読まれる選択します。
select * from T where number = 1;
原理:履歴データのスナップショットを維持するため、他のトランザクションの増加と現在のトランザクションのためのデータを削除するには表示されません。
2.次のキーロック(読み出し電流)
二つの部分を含んでネクストキーロック:
-
レコードのロック(ラインロック)
- ロックギャップ
レコードロックがインデックスラッチに追加され、ロックは、インデックス間の隙間に適用されます。(考える:どのようなインデックスの列が発生しませんか?)
select * from T where number = 1 for update;
select * from T where number = 1 lock in share mode;
insert
update
delete
原理:現在のデータ1本のラインと次のデータロックのデータとの間の隙間、この範囲内の読み出しデータが同じであることを確実にします。
その他:MySQLのInnoDBのエンジンRR分離レベルは、ファントム読み取りを修正します
アドレス上記githubのコメントへの参照:
与えられた魔法の読書MySQLの公式の説明は次のとおりです。限りトランザクションとして、ファントム読み取りのうち、さらに第二列を選択します。
\
トランザクションが選択するために、また、MVCCで出てくるプラスギャップロックは、しかし、総務コミットbの場合、このギャップは(取引することができます自由にDML操作のリリース後)のリリースをロックするん総務bを挿入して、トランザクションの結果を選択しますそして初めての条件を更新せずに同じ、その後、トランザクションを選択し、(新たに追加された総務Bを含む)すべての行に作用します。このアップデートでは、トランザクションは再びこの新しい表示されます、新しい行のBの事務を選択し、更新ラインは、RRレベルで測定された真の、改変されています。\
これが理解されている場合は、その、RRのMySQLのレベルはマジック読書を守るしません
富友達返信アドレス:
ケースを読んでスナップショットでは、ファントムを回避するためのMySQLはMVCCで読み込みます。この読み取り場合は、ファントムを回避するために、次のキーによって、MySQLが読み。SELECT
スナップショットの読み出し選択属する; T = A. 1がどこから T =共有ロックでA. 1 WHEREから
現在の読み出しに属する; MODE
\
スナップショットを読んでいないと得られた結果ではない同じ電流ケースを読み取ることができるが考えられるファントムは2であり、読み取り異なる使用。だから私は、MySQL RRレベルは読書の魔法を解決することであると思います。
私は結論についてお話しましょう、MySQLのストレージエンジンInnoDBの分離レベルRRはファントム読み、問題を解決します。分離の腐ったMySQLの4つのレベルを尋ねるインタビュー、この記事では、あなたが見ていることを示唆しています。
余分な行が、それはファントム読み取りを守ることができないように言った問題への参照として、T1後の更新は、T2は、インサート内のデータで更新されます]を選択します。難攻不落の引数に見えたが、唯一のスナップショットの読み取りは、その後、何のファントムは、問題を読んでいないがあるでしょう場合、InnoDBは、現在の読みと読みモードのスナップショットを提供され、実際に間違っていますが、読むために現在の文にアップグレードした場合、T1でそれを選択必要なときに、次の構文で:T2は、子のデータを挿入することができますよう、更新のためにトンから*現在の読み取りに(共有モードでロック)を選択し、その後、そのようなものは存在しません。
注意を払います
次のキーはすべてが非常によく読まファントムの問題を解決するが、それでも一般的な法則に従っている、同時実行低く、分離レベルが高いです。