この記事では、mysql に関する関連知識を提供します。主に、InnoDB の行レベルのロックに関する関連知識を紹介します。行ロック (名前が示すように、レコード ロックとも呼ばれます) は次のとおりです。ロックの記録を追加しました。皆様のお役に立てれば幸いです。
推奨学習: mysql ビデオ チュートリアル
行ロック (レコード ロックとも呼ばれる) は、名前が示すとおり、追加されたロックです。記録に。ただし、このレコードはインデックス上のインデックス エントリのロックを参照していることに注意してください。 InnoDB のこの行ロック実装機能は、InnoDB がインデックス条件によってデータが取得される場合にのみ行レベルのロックを使用することを意味します。それ以外の場合、InnoDB はテーブル ロックを使用します。
プライマリ キー インデックス、一意のインデックス、または通常のインデックスのいずれを使用する場合でも、InnoDB は行ロックを使用してデータをロックします。
行ロックは、実行プランが実際にインデックスを使用する場合にのみ使用できます。条件でインデックス フィールドが使用されている場合でも、データの取得にインデックスを使用するかどうかは、さまざまなコストを判断して MySQL によって決定されます。実行計画。MySQL がテーブル全体のスキャンの方が効率的であると判断する場合。たとえば、一部の非常に小さなテーブルの場合、インデックスは使用されません。この場合、InnoDB は行ロックの代わりにテーブル ロックを使用します。
同時に、等価条件ではなく範囲条件を使用してデータを取得し、ロックをリクエストすると、InnoDB は条件を満たす既存のデータ レコードのインデックス項目をロックします。
しかし、行ロックであっても、InnoDB ではさまざまなタイプに分類されます。つまり、同じレコードに行ロックをかけても、種類が異なれば効果も異なります。
ここでは、以前の Teacher テーブルを引き続き使用し、インデックスを追加し、いくつかのレコードを挿入します。
mysql> desc teacher; +--------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+-------+ | number | int(11) | NO | PRI | NULL | | | name | varchar(100) | YES | MUL | NULL | | | domain | varchar(100) | YES | | NULL | | +--------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> select * from teacher; +--------+------+--------+ | number | name | domain | +--------+------+--------+ | 1 | T | Java | | 3 | M | Redis | | 9 | X | MQ | | 15 | O | Python | | 21 | A | Golang | +--------+------+--------+ 5 rows in set (0.00 sec)
一般的に使用される行ロックのタイプを見てみましょう。
レコード ロックとも呼ばれ、1 つのレコードのみをロックすることを意味します。正式な型名は LOCK_REC_NOT_GAP です。たとえば、数値 9 のレコードにレコード ロックを追加する概略図は次のとおりです。
レコード ロックは、S ロックと X ロックに分割されます。トランザクションがレコードの S タイプ レコード ロックを取得した後、他のトランザクションはそのレコードの S タイプ レコード ロックを引き続き取得できますが、X タイプ レコード ロックを取得し続けることはできません。レコードの X タイプ レコード ロック。他のトランザクションは、このレコードの S タイプ レコード ロックも X タイプ レコード ロックも取得し続けることはできません。
T2 | |
---|---|
Gap Locks |
#T1
##開始; | |
---|---|
#教師セットのドメイン = 'Redis' の名前 = 'M' を更新します; | |
##insert into Teacher value(23,'B','docker'); # Block |
|
#insert into Teacher value( 23,'B','docker'); # ブロッキング |
以上がMySQL ナレッジ ポイント: InnoDB の行レベルのロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。