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