まず、トランザクションの4つの特性(ACID)
1.原子性
原子性とは、トランザクションに含まれるすべての操作が成功またはロールバックされることを意味します。したがって、トランザクションの操作が成功した場合は、データベースに完全に適用する必要があります。操作が失敗した場合、データベースに影響を与えることはできません。
2.一貫性
整合性とは、トランザクションがデータベースをある整合性状態から別の整合性状態に変更する必要があることを意味します。つまり、トランザクションは実行の前後で整合性のある状態でなければなりません。
ユーザーAとユーザーBの合計が合計5000であると想定して転送を行うと、AとBの間の転送が何回転送されても、トランザクション後に2人のユーザーの合計金額が支払われる必要があります。トランザクションの整合性である5000です。
3.分離
分離とは、同じテーブルを操作する場合など、複数のユーザーがデータベースに同時にアクセスする場合、各ユーザーのデータベースによって開始されたトランザクションが他のトランザクションの操作によって妨害されることはないことを意味します。複数の同時トランザクションは互いに分離する必要があります。
つまり、そのような効果を達成することです。トランザクションT1およびT2の2つの同時トランザクションの場合、トランザクションT1の観点から、T2はT1が開始する前に終了するか、T1が終了した後に開始するため、すべてのトランザクションは感じません。他のトランザクションが同時に実行されるまで。
4.持久性
永続性とは、トランザクションがコミットされると、データベース内のデータへの変更が永続的であることを意味します。データベースシステムで障害が発生した場合でも、トランザクションの送信操作は失われません。
2番目に、トランザクションの分離レベル(デフォルトのトランザクションレベルは繰り返し可能な読み取りです)
データベーストランザクションには、読み取りトランザクション(選択)と変更トランザクション(更新、挿入)の2種類しかありません。トランザクションの分離がない場合、同じデータに対する複数のトランザクションが同時に最終結果に影響を与える可能性があり、次の4つが生成される可能性があります。状況:
1. 2つの更新トランザクションが同じデータを同時に変更すると、非常に深刻な状況が発生し、更新されたデータが失われます。 2. 更新トランザクションがデータを更新すると、別の読み取りトランザクションがまだ送信されていない更新データを読み取ります。この場合、ダーティデータが読み取られます。 3. 読み取りトランザクションがデータの一部を読み取る とき、別の更新トランザクションが同時にデータを変更するため、反復不能な読み取りが発生します。4.読み取りトランザクションがデータを読み取るとき、別のトランザクションがデータの一部を挿入するため、もう1つのデータが読み取られ、マジックリードが発生します。
上記の4つのケースのうち、最初の3つは同じデータに対する同時操作であり、プログラムの結果に致命的な影響を与える可能性があります。上記の4つの状況は、この単純な方法で大まかに理解できます。
1.変更中の変更を許可する(失われたデータ)
2.変更時に読み取りを許可する(ダーティーリード)
3.読み取り時に変更を許可(繰り返し不可の読み取り)
4.読み取り時に挿入を許可(ファントム読み取り)
システムによって許可される状況のレベルが異なるため、データベースの同時動作を設定できるように、トランザクションの分離などのものが登場しました。
概要トランザクションの分離を考慮しない場合、次の問題が発生します。
1.汚い読書
ダーティリードとは、トランザクション中にコミットされていない別のトランザクションからデータを読み取ることを指します。
2.繰り返し不可の読み取り
繰り返し不可の読み取りとは、データベース内の特定のデータについて、トランザクション範囲内の複数のクエリが異なるデータ値を返すことを意味します。これは、クエリ間隔中に、別のトランザクションによって変更および送信されたためです。
繰り返し不可の読み取りとダーティー読み取りの違い:ダーティー読み取りは、何かが別のトランザクションによってコミットされなかったダーティーデータを読み取るとき、繰り返し不可の読み取りは前のトランザクションによって送信されたデータを読み取るときです
3.マジックリーディング
ファントム読み取りとは、トランザクションがデータを読み取るときに別のトランザクションが新しいデータを挿入することです。データを読み取ると、さらに多くのデータが読み取られ、同じ錯覚が発生します。これをファントム読み取りと呼びます。
ファントム読み取りと繰り返し不可の読み取りは、コミットされた別のトランザクションを読み取ります(ダーティ読み取りの場合は異なります)。違いは、繰り返し不可の読み取りは同じデータ項目をクエリし、マジック読み取りはデータのバッチ全体に対するものです。 (データ数など)
MySQLデータベースの3つ、4つのトランザクション分離レベル
コミットなしの読み取り(コミットされていないコンテンツの読み取り)
この分離レベルでは、すべてのトランザクションが、他のコミットされていないトランザクションの実行結果を見ることができます。この分離レベルは、そのパフォーマンスが他のレベルよりもはるかに優れていないため、実際のアプリケーションではほとんど使用されません。コミットされていないデータの読み取りは、ダーティリードとも呼ばれます。
コミットされた読み取り
これは、ほとんどのデータベースシステムのデフォルトの分離レベルです(MySQLのデフォルトではありません)。これは、分離の単純な定義を満たします。トランザクションは、コミットされたトランザクションによって行われた変更のみを確認できます。
この分離レベルは、いわゆる非反復可能読み取り(Nonrepeatable Read)もサポートします。これは、同じトランザクションの他のインスタンスがインスタンス処理中に新しいコミットを持っている可能性があるため、同じ選択が異なる結果を返す可能性があるためです。
繰り返し可能な読み取り
これはMySQLのデフォルトのトランザクション分離レベルであり、これにより、同じトランザクションの複数のインスタンスがデータを同時に読み取るときに同じデータ行が確実に表示されます。ただし、理論的には、これは別の厄介な問題につながります。PhantomReadです。
簡単に言えば、ファントムリーディングとは、ユーザーがデータ行の範囲を読み取ったときに別のトランザクションがその範囲に新しい行を挿入し、ユーザーが再度データ行の範囲を読み取ったときに新しい「ファントム」ライン。
InnoDBおよびFalconストレージエンジンは、Multiversion Concurrency Control(MVCC)メカニズムを通じてこの問題を解決します
シリアライズ可能
これは最高の分離レベルであり、トランザクションが互いに衝突しないように順序付けすることを強制することにより、幻像読み取りの問題を解決します。つまり、読み取られたデータの各行に共有ロックを追加することです。このレベルでは、多数のタイムアウトとロック競合が発生する可能性があります
MySQLでは、4つの分離レベルが実装されているため、次のような問題が発生する可能性があります。
トランザクション分離レベル | 汚い読書 | 繰り返し不可 | ファントムリーディング |
コミットされていない読み取り | はい | はい | はい |
繰り返し不可の読み取り(コミット) | いいえ | はい | はい |
反復可能読み取り | いいえ | いいえ | はい |
シリアライズ可能(シリアライズ可能) | いいえ | いいえ | いいえ |
上記の4つの分離レベルの最高はシリアル化可能レベルであり、最低は非コミット読み取りレベルですが、当然、レベルが高いほど実行効率は低くなります。
Serializableのようなレベルは、(Javaマルチスレッドのロックと同様に)テーブルをロックして、他のスレッドがロックの外側でのみ待機できるようにするため、選択する分離レベルは実際の状況に基づいて決定する必要があります。
MySQLデータベースのデフォルトの分離レベルは、反復可能読み取り(反復可能読み取り)です。
MySQLデータベースでは、上記の4つの分離レベルがサポートされ、デフォルトは反復可能読み取り(反復可能読み取り)です
が、Oracleデータベースでは、シリアル化可能とコミット済み読み取りの2つのレベルのみがサポートされます。、デフォルトはコミットされた読み取りレベルです
MySQLデータベースで現在のトランザクションの分離レベルを表示します。select@@ tx_isolation;