ホームページ >データベース >mysql チュートリアル >ACID の特性と MySQL トランザクションの同時実行の問題の概要
この記事は、mysql に関する関連知識を提供します。主に、MySQL トランザクションの ACID 特性と同時実行の問題の解決策を紹介します。この記事では、このトピックに関する詳細な紹介が提供されており、一定の参考価値があります。必要な方は参考にしていただければ幸いです。
#推奨学習: 1. トランザクションの概念トランザクションデータベース上で動作する 1 つ以上の SQL ステートメントで構成される分割不可能な単位です。トランザクション内のすべての操作が正常に実行された場合にのみ、トランザクション全体がデータベースに送信されます。一部のトランザクション処理が失敗した場合、トランザクションは To になります。元の状態 にロールバックするため、すべてのトランザクションが成功するか、すべて失敗します。
したがって、次のようなトランザクションのいくつかの基本概念を覚えておく必要があります。
トランザクションとは、一連の SQL ステートメントの実行であり、すべて成功するかすべて失敗します。そして、その一部が成功、部分的な失敗結果、トランザクションの実行を保証するアトミック操作のように表示されることはありません。トランザクションのすべての SQL ステートメントが正常に実行された場合にのみ、トランザクションをコミットして結果をディスクに書き込むことができます。トランザクションの実行中に SQL エラーが発生した場合、トランザクションを元の状態にロールバックする必要があります。 たとえば、転送ビジネスでは複数の SQL ステートメントをまとめて完了する必要があり、これらの SQL ステートメントが正常に実行された場合にのみ、ビジネスは成功したと見なされます。トランザクション処理には 3 つの状態があります。
begin: 実行されるすべての SQL ステートメントを開きます。トランザクションはすべて成功し、commit によってトランザクションがコミットされます。停電やサーバー エラーにより SQL ステートメントのいずれかが異常な SQL 実行を引き起こした場合、トランザクションは送信されず、ロールされます。 back (rollback) を実行すると、データはトランザクション開始前の状態に復元されます
これはストレージ エンジンによって保証されます (REDO ログと UNDO ログによって保証されます)MyISAM ストレージ エンジンはトランザクションをサポートしませんが、InnoDB ストレージ エンジンはトランザクションと行ロックをサポートします。
show Engines\G を使用して、現在のデータベースでサポートされているストレージ エンジンを確認します。
@@autocommit を選択;トランザクション コミット ステータスの設定を表示
すべてのトランザクションは次の 4 つの特性を満たす必要があります:
トランザクションのアトミック性(アトミック): トランザクションは分割できない全体です。トランザクションはアトミックな特性を持つ必要があり、トランザクションが変更されると、すべてが実行されるか、何も実行されません。 、つまりトランザクション部分の完了は許可されません。トランザクション Consistency(一貫性):トランザクションの実行前後で、データベースのデータは一貫した状態を維持する必要があります。データベースの一貫性状態はユーザーの責任であり、同時実行制御メカニズムによって実装される必要があります。オンラインショッピングを例にとると、商品を倉庫から出して顧客のショッピングカートに入れるだけで、完全な取引が完了します。 (一貫性はトランザクションに反映されるだけでなく、ストレージ層での MySQL の導入も含まれます。ホットスポット データのアクセス効率を向上させるために、一般にキャッシュ層 Redis または Memery キャッシュが追加されてホットスポット データをキャッシュします。キャッシュ層とデータベース DB 層のデータの整合性の問題) トランザクション 分離 (分離): 複数のトランザクションが同時に実行される場合、データの安全性を確保するため、1 つのトランザクション内の操作を分離します。他の実行中のトランザクションからは見えず、 同時に実行中のトランザクションが相互に影響を与えることを防ぎます。分離レベル: データのセキュリティとトランザクションの同時実行性。分離が厳密であればあるほど、セキュリティは高くなりますが、同時実行性 (つまり、同時実行性の制御、データのセキュリティの確保) は低くなります。 トランザクションの耐久性 (耐久性): トランザクション完了後 (トランザクション)コミットが成功した場合)、DBMS は、データベース内のデータに対する変更が永続的であることを保証し、障害によりデータベースが停止した場合でも、データを復元できる必要があります。
#MySQL で最も重要なのはデータではなくログです。
トランザクションの ACD 機能は、MySQL の REDO ログおよび UNDO ログ メカニズムによって保証され、I 分離は、mysql トランザクションのロック メカニズムによって保証されます。
3. トランザクションの同時実行に関する問題
ダーティ リード: あるトランザクションが別のトランザクションからコミットされていないデータを読み取ります。たとえば、トランザクション A とトランザクション B を同時に実行した場合、トランザクション A が更新された後、トランザクション B は A のコミットされていないデータをクエリして読み取ります。このとき、トランザクション A はロールバックし、トランザクション B によって読み取られたデータは無効なダーティ データ (トランザクション B は、トランザクション A
)Non-repeatable read(NonRepeatable Read) のコミットされていないデータを読み取ります。1 つのトランザクションの操作により、別のトランザクションが前後に 2 回異なるデータを読み取ります。たとえば、トランザクションAとトランザクションBを同時に実行した場合、トランザクションBがクエリを実行してデータを読み込んだ後、トランザクションAはトランザクションBがクエリしたデータを更新します。このとき、トランザクションBは再度データを読み込むと、2回読み込んだデータが異なることがわかります。 。 同じ。 (トランザクション B はトランザクション A の送信されたデータを読み取ります)ファントム読み取り(ファントム読み取り)ファントム読み取り: 1 つのトランザクションの操作により、別のトランザクションの前後 2 つのクエリから得られるデータ量が発生します。取引が異なります。たとえば、トランザクションAとトランザクションBを同時に実行した場合、トランザクションBがクエリを実行してデータを読み込んだ後、トランザクションAはトランザクションBのクエリ条件を満たすレコードを追加または削除します。このとき、トランザクションBは再度クエリを実行し、以前のレコードがクエリは存在しません 既存のレコード、または前のクエリの一部のレコードが欠落しています。 (トランザクション B はトランザクション A の新しく追加されたデータを読み取ったか、トランザクション A によって削除されたデータを読み取れません)トランザクションはコミットされていないため、ダーティ リードを排除する必要があります。一部のシナリオでは、反復不可能な読み取りとファントム読み取りが許可されますが (トランザクションはコミットされています)、必ずしも排除する必要はありません (異なる分離レベルを設定することで)。これはアプリケーション シナリオの要件によって決まります。
#4. トランザクション関連のコマンド
select @@autocommit;
推奨学習:
mysql ビデオ チュートリアル以上がACID の特性と MySQL トランザクションの同時実行の問題の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。