検索
ホームページデータベースmysql チュートリアルMySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    まえがき

    私たちのビジネスは比較的複雑であるため、トランザクションを構成する複数の関連する SQL ステートメントが必要です。そこで、まずトランザクションとは何かについて説明しましょう。トランザクションとは、一緒に実行される SQL ステートメントのグループを指します。すべてが正常に実行されるか、すべてが失敗する必要があります。部分的に成功または部分的に失敗することは許可されません。トランザクションには ACID 特性があります:

    • アトミック性: トランザクションの一貫性を確保するために、すべて成功するかすべて失敗します。

    • 一貫性: たとえば、銀行振込では、ある人のお金を差し引く場合、別の人にお金を追加する必要があります。追加せずに単に差し引くことはできません。このようにして、ビジネス上の問題が発生し、データの一貫性が失われます;

    • 永続性:データをコミットすると、データは最初にキャッシュに書き込まれます。キャッシュ内のデータがディスクに転送されるまでにはまだ時間がかかります。上に書いたように、この時点で停電、ダウンタイム、または再起動が発生した場合、データベースの耐久性を確保するために REDO ログが用意されています。

    • 分離: このセクションでは、トランザクションの同時実行を許可する必要があるため、トランザクションを分離する必要がある理由を説明します。1 つのビジネスには多くのトランザクションが含まれており、多くの場合、バックグラウンドで多数のビジネスが存在します。すべてのトランザクションが逐次的に実行される場合、マルチスレッド プログラムを作成する場合、処理を実行できるスレッドは 1 つだけになり、非常に非効率になります。したがって、トランザクションは同時に実行する必要がありますが、同時実行には、トランザクションのセキュリティと一貫性同時実行効率の問題といういくつかの問題が含まれます。これら 2 つのことを参照点として使用します。 MySQL の並行性/分離のレベル。トランザクションが同時に実行されるときにトランザクションをまったく分離しないと、ダーティ リーディングが発生する可能性があります (トランザクション B はトランザクション A のコミットされていないデータを読み取り、トランザクション A のデータを使用します)コミットされていないデータが計算に使用され、他の多くの結果が取得されます。その後、トランザクション A がそのデータをロールバックします。その後、トランザクション B の計算はすべて問題のあるデータであり、ダーティ リードは確実に問題を引き起こします)、 反復不可能な読み取り (同じ条件でデータを取得し、再度クエリを実行するとデータの値が変わっていることがわかります。もちろん、反復不可能な読み取りは問題にならない場合があります。ビジネス シナリオによっては許可されます。これは、ビジネス データのセキュリティと一貫性が厳密に関連しているかどうかと同じ) と ファントム リーディング (トランザクション内の同じ条件の前後で 2 つのクエリの結果のデータ量が異なる) がこれらの問題です。

    # 次に、トランザクションの同時実行で発生する問題を解決するために、トランザクションの分離レベルを指定します。

    • シリアル化。シリアル化はロックを使用して完全に実装されます。すべてのトランザクションはロックによってソートされ、順番に実行されます。この方法では、データのセキュリティは高くなりますが、同時実行効率は非常に低くなります。通常はこれを行いません。

    • 非コミット読み取り。私たちが作成したマルチスレッド プログラムでは、クリティカル セクションのコード セグメントに対する同時実行制御がありません。同時実行性は高くても、データのセキュリティは非常に低くなります。コミット済み読み取りではダーティ読み取りの存在も許可されますが、これは問題があるため、コミットされていない読み取りは決して使用しないでください。

      シリアル化と非コミット読み取りは、実際のプロジェクトでは使用されません。一般に、データベース エンジンは、デフォルトでコミット読み取りと反復読み取りで動作します。これら 2 つの分離レベルは、データのセキュリティと整合性を結合します。データの同時実行効率は、この 2 つです。 MVCC マルチバージョン同時実行制御メカニズム によって実装されます。

    • コミットされた読み取り、Oracle のデフォルトの作業レベル。コミットされていないデータの読み取りは許可されていません。このレベルでも、非反復読み取りと仮想読み取りの発生は許可されています。

    • 反復読み取り、MySQL のデフォルトの作業レベル。トランザクションが再度読み取られたときにも同じデータが取得されることが保証されており、これにより仮想読み取りが部分的に解決されますが、仮想読み取りは引き続き発生します。

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    注:

    • トランザクション分離レベルが高くなるほど、競合を避けるためにより多くのパフォーマンスが費やされます。 、効率は低いです。

    • 「反復読み取り」レベルでは、仮想読み取りの問題の一部を実際に解決できますが、アップデートの更新によって引き起こされる仮想読み取りの問題を防ぐことはできません。読み取りの場合でも、シリアル化分離レベルを設定する必要があります。

    トランザクション分離レベルの実装原則:

    Lock MVCC。シリアル化の基礎となる実装原理はロックです。ロックには、共有ロック、排他ロック、意図共有ロック、意図排他ロック、ギャップ ロック、デッドロックが含まれます。InnoDB のコミット読み取りと反復読み取りの基礎実装原理: MVCC (複数バージョン同時実行制御)、 MVCC は、スナップショット読み取り (同じデータに複数のバージョンがあります)、現在の読み取り、元に戻すログ、やり直しログなどの同時読み取り方法を提供します。 MVCC はコミット読み取りと反復読み取りの原則であり、ロックはシリアル化の原則です

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    トランザクション ログは ACID 機能を実装するために使用され、共有ロック、排他的ロック、MVCC は整合性 (I) 機能を実装するために使用されます。トランザクション ログは、Undo ログ (ロールバック ログ) と REDO ログ (REDO ログ) に分割されます

    #1. テーブル レベルのロックと行レベルのロック

    • #テーブル レベル ロック:

      テーブル全体をロックします。オーバーヘッドが小さく (ロックするためにテーブル内の特定の行のレコードを見つける必要がないためです。このテーブルを変更したい場合は、このテーブルのロックを直接申請します)、ロックは高速です。

    • デッドロックが存在します;

      ロックの粒度が大きく、ロック競合の可能性が高く、同時実行性が低い

    • 行レベルのロック:

      特定の行レコードがロックされます。コストがかかる (テーブル内で対応するレコードを見つける必要があり、テーブルとインデックスを検索するプロセスがある)、ロックが遅い、デッドロックが発生する、ロックの粒度が最も小さい、ロック競合が発生する可能性が高い最も低く、同時実行性は高くなります

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?MyISAM ストレージ エンジンはテーブル レベルのロックのみをサポートしますが、InnoDB はトランザクション処理、行レベルのロック、

    #2. 排他的ロックと共有ロックMySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    ##排他的ロック:
      X とも呼ばれますロック、書き込みロック
    • 共有ロック:
    • S ロック、読み取りロックとも呼ばれる
    • 読み取りおよび読み取り (SS) ) には互換性がありますが、読み取りと書き込み (SX, SX )、書き込みと書き込み (XX) は相互に排他的です

    1. 間の排他的ロックと共有ロックの互換性をテストします。さまざまなトランザクションMySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    まずテーブル SQL と内容を確認しましょう

    # 分離レベルを確認してください: MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    #まずトランザクション A を開き、id=7 のデータに排他ロックを追加します。

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    #Open別のクライアントのトランザクション B:

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    id=7 に排他ロックまたは共有ロックを追加してもブロックされ、トランザクション A id=7 の行のデータには排他ロック (書き込みロック) が設定されているため、クエリはできません。その他は読み書きできません。 MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    概要: 異なるトランザクション間のデータ ロックの場合、SS ロックのみが共存でき、XX、SX、および XS は共存できません。MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    2. テスト行ロックが追加されました。インデックス項目

    # の実行ロックがインデックス ツリーに追加されます。

    #テストが終了するたびに、実行した内容をロールバックしてください。

    テーブルのインデックスのないフィールドをフィルター条件として使用します

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    トランザクション 2 は、chenwei のさまざまな行のレコードを取得します

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    InnoDB は行ロックをサポートしており、主キー ID をフィルター条件として使用したところ、トランザクション 1 とトランザクション 2 は異なる行のロックを正常に取得できました。しかし、現在、chenwei という名前の排他ロックを取得できないことがわかりました。これはなぜでしょうか?説明しましょう:

    InnoDB の行ロックは、テーブルの行レコードをロックするのではなく、インデックス エントリをロックすることによって実装されますMySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    そして、フィルター条件として名前を使用する場合、インデックスは使用されません。したがって、当然、行ロックは使用されませんが、テーブルロックが使用されます。これは、インデックスを通じてデータが取得される場合にのみ InnoDB が行レベルのロックを使用し、それ以外の場合、InnoDB はテーブル ロックを使用することを意味します!!!

    名前フィールドにインデックスを追加します:

    次に、今の操作を実行します:

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    name にインデックスを追加した後、2 つのトランザクションが異なる行に対して排他的ロック (更新用) を取得できることがわかりました。これは、InnoDB の行ロックがインデックス項目に追加されていることを再度証明しています。

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    name がインデックスを通過するようになったので、zhangsan を使用して、補助インデックス ツリー内でその名前が配置されている行レコードの ID (7) を見つけて、次に進みます。レコード排他ロック (個人的な推測では、補助インデックス ツリーと主キー インデックス ツリー内の対応するレコードがロックされていると考えられます)

    3. シリアル化分離レベル テスト

    すべてのトランザクションのシリアル化はすべて共有ロックまたは排他ロックであるため、手動で追加する必要はありません。選択すると共有ロックが取得され、挿入、削除、更新すると排他的ロックが取得されます。

    シリアル化分離レベルの設定:

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    2 つのトランザクションは同時に共有ロックを取得できます (SS 共存:

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    次に、トランザクション 2 でデータを挿入します。

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    これは、挿入する必要があるためです。 added ロックしますが、トランザクション 1 がテーブル全体に共有ロックを追加したため、トランザクション 2 はテーブルを正常にロックできなくなります (sx は共存しません)

    ロールバックしてすべてのロック取得ステータスを変更します。 ロールback:

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    ##2 つのトランザクションを開く:

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    インデックスが追加されるため上記の選択は、zhangsan

    #Transaction 2update;

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?Transaction という名前のデータに行共有ロックを追加することと同じです。現時点ではテーブル全体がトランザクション 1 の共有ロックによってロックされているため、2 は更新できません。

    トランザクション 2 は補助インデックス ツリーで zhangsan を検索し、対応する主キー値を見つけて、主キー インデックス ツリーは対応するレコードを見つけましたが、このレコード行は共有ロックによってロックされていることがわかりました。トランザクション 2 は共有ロックを取得できますが、排他ロックを取得できません

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?これを再度使用します。主キー インデックスを試して、ID を更新できるかどうかを確認します。

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか? はまだブロックされています。where の後ろのフィールドは現在使用されていますが、名前の代わりに ID を使用すると、補助インデックス ツリーからも名前が見つかります。対応する主キー、次に主キー インデックス ツリーに移動して対応するレコードを検索すると、主キー インデックス ツリー上のレコードはロックされます

    id=8 のデータを更新し、成功しました。選択したとき、id=7 のデータに行ロックがかかっているだけです。もちろん、id=8 のデータも正常に操作できます。

    MySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?

    インデックスがある場合は行ロックを使用し、インデックスがない場合はテーブル ロックを使用します。行レベルのロックはロックの粒度を指しますが、共有ロックと排他的ロックはロックの性質 (テーブル ロックか行ロックか) を指します。共有ロックと排他ロックには区別があります。

    シリアル化は排他ロックと共有ロックを使用します。反復読み取りレベルでは、手動でロックしない場合、MVCC が使用されます。このメカニズムは実際にはロックを使用しません。手動でロックを追加することもできます。 InnoDB はインデックスを作成しません。テーブル ロックを使用します。インデックス項目がクエリで使用される場合、行ロックが使用されます。行ロックは、単にデータの行をロックするのではなく、インデックスをロックします。

    以上がMySQL のテーブル レベルのロック、行レベルのロック、排他的ロック、共有ロックとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明
    この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
    MySQLの役割:WebアプリケーションのデータベースMySQLの役割:WebアプリケーションのデータベースApr 17, 2025 am 12:23 AM

    WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

    MySQL:最初のデータベースを構築しますMySQL:最初のデータベースを構築しますApr 17, 2025 am 12:22 AM

    MySQLデータベースを構築する手順には次のものがあります。1。データベースとテーブルの作成、2。データの挿入、および3。クエリを実行します。まず、createdAtabaseおよびcreateTableステートメントを使用してデータベースとテーブルを作成し、InsertINTOステートメントを使用してデータを挿入し、最後にSelectステートメントを使用してデータを照会します。

    MySQL:データストレージに対する初心者向けのアプローチMySQL:データストレージに対する初心者向けのアプローチApr 17, 2025 am 12:21 AM

    MySQLは、使いやすく強力であるため、初心者に適しています。 1.MYSQLはリレーショナルデータベースであり、CRUD操作にSQLを使用します。 2。インストールは簡単で、ルートユーザーのパスワードを構成する必要があります。 3.挿入、更新、削除、および選択してデータ操作を実行します。 4. Orderby、Where and Joinは複雑なクエリに使用できます。 5.デバッグでは、構文をチェックし、説明を使用してクエリを分析する必要があります。 6.最適化の提案には、インデックスの使用、適切なデータ型の選択、優れたプログラミング習慣が含まれます。

    MySQLは初心者に優しいですか?学習曲線の評価MySQLは初心者に優しいですか?学習曲線の評価Apr 17, 2025 am 12:19 AM

    MySQLは初心者に適しています。1)インストールと構成、2)リッチラーニングリソース、3)直感的なSQL構文、4)強力なツールサポート。それにもかかわらず、初心者はデータベースの設計、クエリの最適化、セキュリティ管理、データのバックアップなどの課題を克服する必要があります。

    SQLはプログラミング言語ですか?用語を明確にするSQLはプログラミング言語ですか?用語を明確にするApr 17, 2025 am 12:17 AM

    はい、sqlisaprogramginglanguagespecializedfordatamanamanagement.1)それはdeclarative、focusingonwhattoachieveratherthanhow.2)

    酸性の特性(原子性、一貫性、分離、耐久性)を説明します。酸性の特性(原子性、一貫性、分離、耐久性)を説明します。Apr 16, 2025 am 12:20 AM

    酸性属性には、原子性、一貫性、分離、耐久性が含まれ、データベース設計の基礎です。 1.原子性は、トランザクションが完全に成功するか、完全に失敗することを保証します。 2.一貫性により、データベースがトランザクションの前後に一貫性を保証します。 3.分離により、トランザクションが互いに干渉しないようにします。 4.永続性により、トランザクションの提出後にデータが永久に保存されることが保証されます。

    MySQL:データベース管理システムとプログラミング言語MySQL:データベース管理システムとプログラミング言語Apr 16, 2025 am 12:19 AM

    MySQLは、データベース管理システム(DBMS)であるだけでなく、プログラミング言語にも密接に関連しています。 1)DBMSとして、MySQLはデータを保存、整理、取得するために使用され、インデックスを最適化するとクエリのパフォーマンスが向上する可能性があります。 2)SQLとPythonに埋め込まれたプログラミング言語とSQLalchemyなどのORMツールを使用すると、操作を簡素化できます。 3)パフォーマンスの最適化には、インデックス、クエリ、キャッシュ、ライブラリ、テーブル分割、およびトランザクション管理が含まれます。

    MySQL:SQLコマンドでデータの管理MySQL:SQLコマンドでデータの管理Apr 16, 2025 am 12:19 AM

    MySQLはSQLコマンドを使用してデータを管理します。 1.基本コマンドには、select、挿入、更新、削除が含まれます。 2。高度な使用には、参加、サブクエリ、および集計関数が含まれます。 3.一般的なエラーには、構文、ロジック、パフォーマンスの問題が含まれます。 4。最適化のヒントには、インデックスの使用、Select*の回避、制限の使用が含まれます。

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    Safe Exam Browser

    Safe Exam Browser

    Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    MantisBT

    MantisBT

    Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

    VSCode Windows 64 ビットのダウンロード

    VSCode Windows 64 ビットのダウンロード

    Microsoft によって発売された無料で強力な IDE エディター

    WebStorm Mac版

    WebStorm Mac版

    便利なJavaScript開発ツール