ホームページ  >  記事  >  データベース  >  MySQL トランザクション、ロック、アプリケーション (2)

MySQL トランザクション、ロック、アプリケーション (2)

黄舟
黄舟オリジナル
2017-02-06 10:40:541059ブラウズ

InnoDB はトランザクション、行ロック、テーブル ロックをサポートします。MyISAM はトランザクションをサポートせず、テーブル ロックのみをサポートします。ここでは InnoDB のみを紹介します。

InnoDB は、次の 2 種類の行ロックを実装します。

  • 共有ロック(S): 1 つのトランザクションが行を読み取ることを許可し、他のトランザクションが同じデータ セットの排他ロックを取得できないようにします。

  • 排他ロック (X): 排他ロックを取得するトランザクションがデータを更新できるようにし、他のトランザクションが同じデータ セットに対して共有読み取りロックと排他書き込みロックを取得できないようにします。

さらに、行ロックとテーブル ロックを共存させ、複数粒度のロック メカニズムを実装できるようにするために、InnoDB には内部的に使用される 2 つのインテンション ロック (インテンション ロック) もあり、どちらもテーブル ロックです。

  • 意図共有ロック (IS): トランザクションは、データ行に行共有ロックを追加することを目的としており、データ行に共有ロックを追加する前に、まずテーブルの IS ロックを取得する必要があります。

  • 意図排他ロック (IX): トランザクションは、データ行に行排他ロックを追加することを目的としており、データ行に排他ロックを追加する前に、まずテーブルの IX ロックを取得する必要があります。 InnoDB 行ロック モード互換性リスト

    S
IS

Xロックモードが要求された場合トランザクションによる現在のロック、InnoDB との互換性要求されたロックをトランザクションに許可します。そうでない場合、この 2 つに互換性がない場合、トランザクションはロックが解放されるまで待機します。 注: インテンション ロックは InnoDB によって自動的に追加され、ユーザーの介入は必要ありません。 UPDATE、DELETE、INSERT ステートメントの場合、InnoDB は関連するデータ セットに排他ロック (X) を自動的に追加します。 通常の SELECT ステートメントの場合、InnoDB はロックを追加しません。 InnoDB の行ロックは、インデックス上のインデックス項目をロックすることによって実装されます。したがって、InnoDB の行ロック実装機能は、InnoDB がインデックス条件を通じてデータを取得するためにのみ行レベルのロックを使用することを意味します。それ以外の場合は、InnoDB がテーブル ロックを使用します。 。 さらに、トランザクションは、次のステートメントを使用して、レコードセットに共有ロックまたは排他ロックを明示的に追加できます。
conflict

conflict

conflict

conflict

IX
conflict 互換 競合 互換性のある
S 競合 競合 互換性あり 互換性あり
IS 競合 互換性あり 互換性あり 互換性あり

共有ロック: SELECT * FROM table_name WHERE ... 共有モードでロック。

  • 排他ロック (X): SELECT * FROM table_name WHERE ... FOR UPDATE。

  • 共有ロックを取得するには SELECT ... IN SHARE MODE を使用します。これは主に、データの依存関係が必要な場合にレコードの特定の行が存在するかどうかを確認し、誰も UPDATE または DELETE を実行しないようにするために使用されます。このレコードに対する操作。ただし、現在のトランザクションでもレコードを更新する必要がある場合は、デッドロックが発生する可能性があります。ロック後に行レコードを更新する必要があるアプリケーションの場合は、SELECT... FOR UPDATE メソッドを使用して排他ロックを取得する必要があります。 。

    上記は MySQL トランザクション、ロック、アプリケーション (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。