データベーストランザクションと分離レベルに関する簡単な説明

青灯夜游
リリース: 2019-11-29 17:04:32
転載
2942 人が閲覧しました

データベーストランザクションと分離レベルに関する簡単な説明

トランザクション

トランザクションとは、ACID 特性を満たす一連の操作を指します。トランザクションは、コミットを通じて送信できます。ロールバックを使用してロールバックすることもできます。

ACID

1. アトミック性

トランザクションは分割できないとみなされます トランザクションの最小単位、トランザクションのすべての操作が正常に送信されるか、すべての操作が失敗してロールバックされます。ロールバックは、ロールバック ログを使用して実装できます。ロールバック ログには、トランザクションによって実行された変更操作が記録されます。これらの変更操作は、ロールバック中に逆に実行できます。

2. 一貫性

一貫性とは、トランザクションがデータベースをある一貫性状態から別の一貫性状態に変換する必要があることを意味します。実行前と実行後の両方で一貫した状態。

送金を例に挙げると、ユーザー A とユーザー B の合計金額が 5,000 であると仮定すると、A と B の間で送金がどのように行われたか、または送金が何回完了したかに関係なく、トランザクションの完了後、2 人のユーザーは同じになります。合計は最大 5000 になり、これがトランザクションの一貫性を表します。

3. 分離

分離とは、同じテーブルを操作する場合など、複数のユーザーがデータベースに同時にアクセスする場合であり、データベースはユーザーごとに開かれます。他のトランザクションの操作によって干渉されるため、複数の同時トランザクションを互いに分離する必要があります。

このような効果を実現するには: 2 つの同時トランザクション T1 と T2 の場合、トランザクション T1 の観点から見ると、T2 は T1 が開始する前に終了するか、T1 が終了した後に開始されます。そのため、各トランザクションは他のトランザクションが実行されていることを認識しません。同時実行中。

4. 耐久性

耐久性とは、トランザクションが送信されると、たとえトランザクションのコミット操作が行われなくても、データベース内のデータへの変更が永続的に続くことを意味します。データベース システムに障害が発生した場合でも、データは失われます。

同時実行性の一貫性の問題

1. ダーティ リード

ダーティ リードは、からのデータを参照します。トランザクション処理中に別のコミットされていないトランザクションが読み取られました。

T1 がデータを変更し、T2 がこのデータを読み取ります。 T1 がこの変更を元に戻すと、T2 によって読み取られたデータはダーティ データになります。

データベーストランザクションと分離レベルに関する簡単な説明

2. 反復不可能な読み取り

反復不可能な読み取りとは、データベース内の特定のデータを参照します。トランザクション 複数のクエリが異なるデータ値を返しました。これは、クエリ間の別のトランザクションによって変更およびコミットされたためです。

たとえば、トランザクション T1 は特定のデータを読み取り、トランザクション T2 はすぐにデータを変更し、トランザクションをデータベースに送信します。トランザクション T1 がデータを再度読み取ると、異なる結果が得られ、反復不可能なメッセージが送信されます。読む。

ノンリピータブルリードとダーティリードの違いは、ダーティリードはトランザクションが別のトランザクションのコミットされていないダーティデータを読み取るときであるのに対し、ノンリピータブルリードは前のトランザクションによって送信されたデータが読み取られることです。

データベーストランザクションと分離レベルに関する簡単な説明

#3. ファントム リーディング

ファントム リーディングは、トランザクションが独立して実行されない場合に発生する現象です。たとえば、トランザクション T1 はテーブル内のすべての行のデータ項目を「1」から「2」に変更します。このとき、トランザクション T2 はテーブルにデータ項目の行を挿入しますが、このデータ項目の値は「1」のままです。 " をデータベースに送信しました。トランザクションT1を操作するユーザーが、変更されたばかりのデータを見ると、まだ変更されていない行が1行残っていることに気づきますが、実はこの行はトランザクションT2から追加されたもので、まるで幻覚のようです。これは幻の読み物です。

ファントム読み取りと非反復読み取りはどちらも、別のコミットされたトランザクションを読み取ります (これはダーティ読み取りとは異なります)。違いは、非反復読み取りは同じデータ項目をクエリするのに対し、ファントム読み取りはクエリをクエリするということです。データ全体(データ数など)。

T1 は特定の範囲のデータを読み取り、T2 はこの範囲に新しいデータを挿入し、T1 は再びこの範囲のデータを読み取ります。このときに読み取られた結果は、最初に読み取られた結果とは異なります。

データベーストランザクションと分離レベルに関する簡単な説明

#MySQL 分離レベル##1. シリアル化可能:

トランザクションの強制実行シリアルに。

これにより、ダーティ リード、非反復読み取り、ファントム リードの発生を回避できます。

2. 反復可能な読み取り:

同じトランザクション内で同じデータを複数回読み取った結果が同じであることを確認します

ダーティ リード、反復不可能な読み取りを回避します。が発生します。

3. コミットされた読み取り:

トランザクションは、コミットされたトランザクションによって行われた変更のみを読み取ることができます

これにより、ダーティ リードの発生を回避できます。

4. コミットされていない読み取り:

トランザクション内の変更は、コミットされていない場合でも他のトランザクションに表示されます

最低レベル、いかなる状況でも保証はありません。

分離レベルの最も高いレベルは Serializable レベル、最も低いレベルは Read uncommitted レベルであり、レベルが高くなるほど実行効率は低くなります。

Serializable のようなレベルでは、他のスレッドがロックの外でのみ待機できるようにロック テーブル (Java マルチスレッドのロックと同様) を使用するため、通常選択する分離レベルは実際の状況に基づいて選択する必要があります。 . .

MySQL データベースのデフォルトの分離レベルは、反復読み取り (反復読み取り) です。

Oracle データベースでは、シリアル化可能 (シリアル化) レベルと読み取りコミット済み (読み取りコミット済み) の 2 つのレベルのみがサポートされています。デフォルトは読み取りコミット済みレベルです。

推奨学習: MySQL チュートリアル

以上がデータベーストランザクションと分離レベルに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート