InnoDB はトランザクション、行ロック、テーブル ロックをサポートします。MyISAM はトランザクションをサポートせず、テーブル ロックのみをサポートします。ここでは InnoDB のみを紹介します。
InnoDB は、次の 2 種類の行ロックを実装します。
共有ロック(S): 1 つのトランザクションが行を読み取ることを許可し、他のトランザクションが同じデータ セットの排他ロックを取得できないようにします。
排他ロック (X): 排他ロックを取得するトランザクションがデータを更新できるようにし、他のトランザクションが同じデータ セットに対して共有読み取りロックと排他書き込みロックを取得できないようにします。
さらに、行ロックとテーブル ロックを共存させ、複数粒度のロック メカニズムを実装できるようにするために、InnoDB には内部的に使用される 2 つのインテンション ロック (インテンション ロック) もあり、どちらもテーブル ロックです。
意図共有ロック (IS): トランザクションは、データ行に行共有ロックを追加することを目的としており、データ行に共有ロックを追加する前に、まずテーブルの IS ロックを取得する必要があります。
意図排他ロック (IX): トランザクションは、データ行に行排他ロックを追加することを目的としており、データ行に排他ロックを追加する前に、まずテーブルの IX ロックを取得する必要があります。 InnoDB 行ロック モード互換性リスト
Sconflictconflictconflictconflict IX | conflict | 互換 | 競合 | 互換性のある |
S | 競合 | 競合 | 互換性あり | 互換性あり |
IS | 競合 | 互換性あり | 互換性あり | 互換性あり |
ロックモードが要求された場合トランザクションによる現在のロック、InnoDB との互換性要求されたロックをトランザクションに許可します。そうでない場合、この 2 つに互換性がない場合、トランザクションはロックが解放されるまで待機します。 | 注: | インテンション ロックは InnoDB によって自動的に追加され、ユーザーの介入は必要ありません。 | ||
通常の SELECT ステートメントの場合、InnoDB はロックを追加しません。 | InnoDB の行ロックは、インデックス上のインデックス項目をロックすることによって実装されます。したがって、InnoDB の行ロック実装機能は、InnoDB がインデックス条件を通じてデータを取得するためにのみ行レベルのロックを使用することを意味します。それ以外の場合は、InnoDB がテーブル ロックを使用します。 。 |
共有ロック: SELECT * FROM table_name WHERE ... 共有モードでロック。
排他ロック (X): SELECT * FROM table_name WHERE ... FOR UPDATE。