MySQL データベースのトランザクション分離レベルについての話

トランザクション分離レベルの概要

4 つのトランザクション分離レベル

「リード現象」とは、複数のトランザクションを同時に実行した場合、データの読み込みにおいてダーティリード、ファントムリード、ノンリピータブルリードが発生する可能性があることを指します。
データベース トランザクションには 4 つの分離レベルがあり、低から高まで、Read uncommitted (コミットされていない読み取り)、Read Committed (コミットされた読み取り)、Repeatable Read (反復可能な読み取り)、Serializable (シリアル化) です。これらの間の関係を理解することで、概念と違いをより良く理解できます。問題を回避します。

コミットされていない読み取り (READ UNCOMMITTED)

この分離レベルでは、ダーティ読み取り、反復不能読み取り、およびファントム読み取りが発生する可能性があります。
この分離レベルのトランザクションは、ファントム読み取り操作や反復不可能な読み取り操作が発生しやすいことに加えて、他のトランザクションと同じレベルのトランザクションでコミットされていないデータを読み取ることができます。このトランザクションが他のトランザクションがコミットしない変更を使用する場合、計算の基礎として使用され、コミットされていないデータが取り消されると、大量のデータ エラーが発生し、データの不整合が発生します。

コミットされた読み取り

この分離レベルでは、反復不可能な読み取りとファントム読み取りが発生する可能性があり、
そのようなトランザクション中に、他のトランザクションが対応する数のテーブル行を変更すると、同じトランザクションの複数の SELECT ステートメントが異なる結果を返す可能性があります。トランザクションでは、他のトランザクションによって送信されたデータを確認できます。

反復可能な読み取り (REPEATABLE READ)

この分離レベルでは、ファントム読み取りが発生する可能性があります。Mysql
では、トランザクション ACID 特性の分離特性を保証する必要があるため、InnoDB エンジンのデフォルトの分離レベルは RR (Repeatable Read) です。

シリアル化 (SERIALIZABLE)

この分離レベルでは、複数の並列トランザクションがセキュリティ上の問題なく連続して実行されます。
これら 4 つの分離レベルのうち、シリアル化のみがすべての問題を解決しますが、この分離レベルのパフォーマンスが最も低いことも意味します。

ダーティリード、ファントムリード、反復不能リード

トランザクション分離レベルは、複数の並列トランザクションの競合によって生じるデータのセキュリティ問題を解決するための仕様です。具体的には、複数のトランザクションの競合によって 3 つの異なる現象が発生する可能性があります。

ダーティリード

(図に示すように) 2 つのトランザクション T1/T2 が同時に実行されていると仮定すると、T1 トランザクションは T2 トランザクションのコミットされていないデータを読み取る可能性がありますが、コミットされていないトランザクション T2 がロールバックされる可能性があり、これにより T1 トランザクションがread 結局、存在するとは限らないデータがダーティリードを引き起こすことになります。

ここに画像の説明を挿入

反復不可能な読み取り

(図に示すように) 2 つのトランザクション T1/T2 が同時に実行されると仮定すると、同じ行のデータを異なるタイミングで読み取ると、トランザクション T1 の結果が異なる可能性があり、その結果、反復不可能な読み取りの問題が発生します。

ここに画像の説明を挿入

ファントムリーディング

(図に示すように) 2 つのトランザクション T1/T2 が同時に実行された場合、トランザクション T1 が範囲クエリまたは範囲変更を実行する過程で、トランザクション T2 はトランザクション T1 の範囲に属するデータを挿入して送信します。このとき、トランザクションT1でクエリを実行すると、T1トランザクションでは余分なデータが存在したり、このデータが変更されていないことが錯覚していることが判明し、この現象をファントムリーディングと呼びます。 。

ここに画像の説明を挿入

要約する

MySQL トランザクション分離レベルは、複数のトランザクションが同時にデータベースにアクセスするときに、データベースがデータの一貫性と分離をどのように確保するかを指します。一般的な分離レベルは次のとおりです。

  • Read Uncommitted: コミットされていないデータ変更の読み取りを許可する最も低い分離レベル。
  • コミットされた読み取り: 同時トランザクションによってコミットされたデータの読み取りを許可します。
  • 反復可能な読み取り: トランザクション自体によってデータが変更されない限り、同じフィールドの複数の読み取りの結果は一貫しています。
  • シリアル化: ACID 分離レベルに完全に準拠した最高の分離レベル。すべてのトランザクションは 1 つずつ順番に実行されるため、トランザクション間で干渉が発生する可能性はありません。

実際のアプリケーションでは、データの一貫性と同時実行パフォーマンスのバランスをとるために、特定の状況に応じて適切な分離レベルを選択する必要があります。たとえば、同時実行性の高い Web アプリケーションでは、データの一貫性と同時実行性を確保するために反復可能な読み取り分離レベルを選択できます。同時実行、同時パフォーマンス。

  • ダーティ リード: トランザクション A は、トランザクション B によって変更されたがまだ送信されていないデータを読み取ります。
  • 反復不可能な読み取り: トランザクション A の同じクエリ ステートメントの結果は、異なる時点で一貫性がありません。
  • ファントム読み取り: トランザクション A は、トランザクション B によって送信された新しいデータを読み取ります。
分離レベル 同時実行の問題 該当シーン
コミットされていない読み取り ファントム読み取り、ダーティー読み取り、または反復不可能な読み取りが発生する可能性があります 同時実行要件は高くありません
コミットされた読み取り ファントム読み取りまたは反復不可能な読み取りが発生する可能性があります 高い同時実行要件
反復可能な読み取り ファントムリード 高いデータ一貫性要件
連載 干渉なし データの一貫性要件は非常に高い

分離レベルは上から下、低から高の順です。分離レベルが高くなるほど、トランザクションの同時実行パフォーマンスは低くなります。

おすすめ

転載: blog.csdn.net/wml_JavaKill/article/details/131768917