MySQLトランザクション分離レベル、ダーティリード、繰り返し不可能なリード、ファントムリードとは何か、およびそれを解決する方法

  ダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取りについて説明する前に、データベースのトランザクション分離レベルについて説明しましょう。MySQLのトランザクション分離レベル(分離レベル)とは、次のことを指します。複数のスレッドがデータベースを操作する場合、データベースは、データを取得する際の各スレッドの精度を確保するための分離操作を担当します。これは4つの異なるレベルに分けられ、分離レベルでソートされ、コミットされていない読み取り<送信された読み取り<繰り返し可能性<シリアル化されます。
ここに画像の説明を挿入します

  ダーティリード、繰り返し不可能なリード、ファントムリードとは何ですか、およびそれらを解決する方法

  コミットされていない読み取り:分離レベルが最も低く、分離が最も弱い読み取りダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取りがすべて発生する可能性があります。したがって、基本的には理論上存在し、実際のプロジェクトでは誰も使用しませんが、最高のパフォーマンスを発揮します。

  読み取りコミット(読み取りコミット):トランザクションに中間状態データが表示されないようにし、すべてのデータがコミットおよび更新されるようにします。これにより、ダーティ読み取りの問題が解決されます。ただし、読み取りコミットレベルはまだ非常に低く、トランザクションがデータを同時に変更できるため、再度読み取ったときに同じデータが取得される保証はありません。つまり、繰り返し不可能な読み取りやファントムが発生する可能性があります。読み取ります。

  繰り返し可能な読み取り:MySQL InnoDBエンジンのデフォルトの分離レベルは、同じトランザクションで複数回読み取られるデータの一貫性を保証し、ダーティ読み取りと繰り返し不可能な読み取りを解決しますが、ファントム読み取りの可能性はあります。

  シリアル化可能:「シリアル化可能」を選択すると、データを読み取るときに共有読み取りロックを取得する必要があります。データを更新するときに排他的書き込みロックを取得する必要があります。SQLがWHEREステートメントを使用する場合は、間隔ロックも取得されます。つまり、トランザクションAがデータベースを操作する場合、トランザクションBはインラインでしか待機できないため、パフォーマンスが最も低くなります。

上記はデータベースのトランザクション分離レベルです。ダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取りとは何ですか。

  1.ダーティリード:コミットされていないトランザクションのデータが読み取られました。
ここに画像の説明を挿入します

  トランザクションAとBが2つあるとします。同時実行の場合、トランザクションAは最初に商品データテーブルのデータの読み取りを開始し、次に更新操作を実行します。トランザクションAがこの時点で更新操作を送信していない場合、トランザクションBがたまたま開始された後、製品データも読み取る必要があります。このとき、トランザクションBはトランザクションAの更新されたデータをクエリします。

  次にトランザクションAがロールバックをトリガーした場合、トランザクションBによって読み取られたばかりのデータは古いデータであり、この現象はダーティ読み取りです。

  「ダーティリード」を解決する方法:

  ダーティ読み取りの分離レベルは「コミットされていない読み取り」であり、この分離レベルのみがダーティ読み取りを発生させます。

ダーティリードの解決策は、「リードコミット」などのトランザクション分離レベルをアップグレードすることです。

  2.繰り返し不可の読み取り:トランザクションAが最初にデータを読み取り、次にロジックを実行する過程で、トランザクションBがこのデータを更新します。トランザクションAが再度読み取ると、データが一致しないことがわかります。この現象「繰り返し不可の読み取り」です。
ここに画像の説明を挿入します
  「繰り返し不可能な読書」を解決する方法:

  簡単に言えば、2回読み取られたデータは途中で変更され、対応する分離レベルは「コミットされていない読み取り」または「送信された読み取り」です。

  繰り返し不可能な読み取りの解決策は、「繰り返し可能性」などのトランザクション分離レベルをアップグレードすることです。

  3.ファントム読み取り:トランザクションでは、同じクエリステートメントが異なる期間に実行され、異なる結果セットが取得されます。
ここに画像の説明を挿入します

  トランザクションAは商品テーブルを1回読み取り、最終IDは3であり、トランザクションBもそれを1回読み取り、最終IDも3です。次に、トランザクションAが行を挿入し、最新のIDが4(ID 3 + 1)であることを読み取り、トランザクションBも行を挿入して、最新のIDを読み取り、それが5ではなく5であることを確認しました。 3.プラス1。

  IDを使って判断したり、重要なデータを処理したりする場合、問題が発生します。この現象は、トランザクションBを幻想にするようなもので、予期しないデータが読み取られるため、ファントム読み取りと呼ばれます。もちろん、新しいデータを追加するだけでなく、データを削除および変更する場合も、同様の状況が発生する可能性があります。

  「ファントムリーディング」を解決する方法:

  ファントム読み取りではトランザクション分離レベルを「シリアライズ可能」にアップグレードできないため、データベースも並行処理機能を失うという問題を解決します。

  すべてのレコードがロックされていても、新しいデータの挿入を防ぐことはできないため、行ロックはファントム読み取りを解決できません。

  ファントム読み取りの解決策は、レコード間の「ギャップ」をロックすることです。そのため、MySQL InnoDBでは、ギャップロック(ギャップロック)と呼ばれる新しいロックが導入されています。これには、ファントム読み取りを解決するためにギャップロックを使用する必要があります。

おすすめ

転載: blog.csdn.net/qq_30353203/article/details/113855130