Innodb は 2 つの行レベルのロックを?qū)g裝します。1 つは共有ロック、もう 1 つは排他ロックです。
すみません:
(1) 行レベルのロックは行レコードのみをロードできますか?共有ロックと排他ロックがテーブル レベルでも使用できるという記述があるのはなぜですか?
ヒントを教えていただけますか?
InnoDB の行ロックは、InnoDB が実際にインデックスに基づいて行をロックするため、ロック ステートメント (つまり、FOR UPDATE および LOCK IN SHARE MODE) がインデックスを使用する場合にのみ有効です。つまり、インデックスが使用されていない場合、ロックは自動的にテーブル レベルに引き上げられます。
上記のように、トランザクション分離レベルが繰り返し読み取り (mysql のデフォルト レベル) の場合、
InnoDB エンジンがデータを変更および削除するとき、最初に対応するインデックスを見つけます。インデックスはすべてソートされているため、特定の値またはロックされます。範囲。
この範囲がインデックス セグメント全體である場合、テーブル データ全體がロックされます。さらに、インデックスがない場合は、変更および削除中にテーブル全體がデータに対してスキャンされ、テーブル全體が自然にロックされます。
InnoDB は次の 2 種類の行ロックを?qū)g裝します。
共有ロック: 1 つのトランザクションが行を読み取ることを許可し、他のトランザクションが同じデータ セットを取得できないようにする排他的ロック。
排他的ロック (X): 排他的ロックを取得するトランザクションがデータを更新できるようにし、他のトランザクションが同じデータ セットに対する共有読み取りロックと排他的書き込みロックを取得できないようにします。さらに、行ロックとテーブル ロックを共存させ、複數(shù)粒度のロック メカニズムを?qū)g裝できるようにするために、InnoDB には內(nèi)部的に使用される 2 つのインテンション ロック (インテンション ロック) もあり、どちらもテーブル ロックです。
意図された共有ロック (IS): トランザクションは、データ行のロックを共有することを目的としており、データ行に共有ロックを追加する前に、まずテーブルの IS ロックを取得する必要があります。
意図された排他ロック (IX): トランザクションは、データ行に排他ロックを追加する前に、まずテーブルの IX ロックを取得する必要があります。
ロックはmysqlエンジンに共通です。行ロックとテーブルロックはロック粒度の観點から區(qū)別されます