[JavaWeb] ダーティ書き込み、ダーティ読み取り、反復不能読み取り、およびファントム読み取りはなぜ発生しますか?

1. ダーティ書き込み、ダーティ読み取り、非反復読み取り、ファントム読み取りはなぜ発生するのですか?

通常の業務システムとデータベースとの接続は単一ではなく、通常は複数のスレッドが同時にデータベースを操作しており、複数のスレッドが同時に同じデータを操作し、多数の操作が行われる場合があります。トランザクション形式で実行されるのが一般的で、やり直しにはREDOログ、ロールバックにはUNDOログを使用することができますが、単一のトランザクションであれば問題ありませんが、複数のトランザクションになるとおかしな現象が発生します。

2. 汚い文字はどのようにして現れましたか?

ここに画像の説明を挿入
ここで、トランザクション A とトランザクション B の 2 つが存在します。これらは同じデータ C を操作します。A は最初に C を A に変更し、次に B が値を B に変更し、その後トランザクション B がコミットされます。データを変更するとき、トランザクション A は元に戻すログを書き込むことに注意してください。トランザクション B がコミットされた後、トランザクション A がロールバックされると、元に戻すログの内容が実行され、値は C に戻ります。これは非常に奇妙です。トランザクション A には影響がないようですが、トランザクション B については、これまでこのデータに対して操作を行っていないようです。これはダーティ ライティングです。

ダーティ ライティングの本質は、トランザクション A がコミットされる前の同じデータに対するトランザクション B の書き込み操作が、トランザクション A のロールバックによって無効になることです。

ここに画像の説明を挿入
発生時期の観点から見ると上の図のようになるでしょう、要するに、他のものがコミットされる前に発生した書き込み操作がロールバックにより無効になる、つまりダーティライトです(両方が変更されていることが前提)同じデータ)

3. ダーティ・リーディングとは何ですか?

実際、ダーティ リードは、上で説明したダーティ ライティングの原理と似ています。

同じ 2 つのこと A と B、A はデータ C を A に更新し、次に B トランザクションがこのデータ行を読み取り、その値が A になり、B トランザクションがそれを予期せず使用します この時点で、トランザクション A にはトランザクション B によって読み取られた A の値が無効な値になるロールバック操作。次の図に示すように、これはトランザクション B のダーティ リードです
ここに画像の説明を挿入
。ダーティ書き込みとダーティ読み取り?

  • この理由は、元に戻すログを通じて別のことがロールバックされるためです。
  • 同じデータを操作する
  • ダーティ リードおよびダーティ ライトによって操作されるデータは、ダーティ データ (時間内にディスクにフラッシュされなかったデータがメモリ内で変更されたデータ) とも呼ばれます。

4. ノンリピータブルリードとは何ですか?

以前のダーティ リードの問題は、次の制限によって防ぐことができます。それぞれのモノは、他のモノによってコミットされたデータのみを参照でき、変更されたがコミットされていないデータは参照できません。でも大丈夫でしょうか?次の状況を見てみましょう。

Thing A が最初にデータ C を読み取り
ここに画像の説明を挿入
、次に Thing B がこの値を変更して B に変更し、その後 Thing B が Thing A を送信します。
ここに画像の説明を挿入
このとき、この値を再度読み取ると、値が 2 回読み込まれていることがわかります前と後は同じではありません!

ここに画像の説明を挿入トランザクション A では、トランザクションがコミットされる前に同じデータが複数回読み取られ、読み取られた値がすべて同じではないことがわかりました。この現象をノンリピータブル リードと呼びます。その名のとおり、同じ値が読み取られます。繰り返し読むことはできません

5. ファントムリーディングについてはどうですか?

名前からして、この読書の結果は人々に幻覚を感じさせるはずだと推測できますが、一体何が起こっているのでしょうか?シナリオで説明してみましょう

ここで、A ということがあります。select * from xxx where age < 50 を実行し、データベースから 20 個のデータを読み取ります

ここに画像の説明を挿入
この時点では、トランザクション A の実行がまだ終了していないため、別のトランザクション B が入ってきます。トランザクション B は、次のように、年齢が 50 未満の 5 個のデータをこのテーブルに挿入します。次に、トランザクション A は select * from xxx where age を実行します
ここに画像の説明を挿入
。 < 50。この時点で 25 個のデータがクエリされています。トランザクション A を見ると、2 つのクエリの数が異なるのはなぜですか? その驚きの度合いは、ポケットからお金を取り出したときに、最初に50元が出て、2回目にポケットから出したときに150元が出てきたとき、幻覚を見ているのではないかと思うほどです。
このように、前後2回のデータ読み出し量が一致しない状態をファントムリードと呼びます。

6. まとめ

今日はダーティライト、ダーティリード、非反復性、ファントムリードがどのように発生するのか、その特徴を紹介します、次回はMySQLがどのような方法で上記の状況を回避するのかを紹介します。 , この記事に補足や修正が必要なところがあれば、指摘していただければと思います。

おすすめ

転載: blog.csdn.net/wang_qiu_hao/article/details/125216950