mysql におけるテーブル ロックと行ロックの違いは次のとおりです: 1. テーブル ロックは myisam ストレージ エンジンを優先し、行ロックは innodb ストレージ エンジンを優先します; 2. テーブル ロックのオーバーヘッドは小さいですが、行ロックのオーバーヘッドは小さいです。大きなオーバーヘッド; 3. テーブル ロック ロックの粒度は大きく、行ロックのロックの粒度は小さくなります。
#この記事では、MySQL のテーブル ロックと行ロックについて詳しく説明し、違いを分析および比較します。
(ビデオ チュートリアルの推奨:
mysql ビデオ チュートリアル)
1. テーブル ロック
機能: MyISAM ストレージ エンジンを優先します。オーバーヘッドが小さく、ロックが速く、デッドロックがありません。ロックの粒度が大きく、ロック競合の確率が最も高く、同時実行性が最も低くなります。
テーブルを編集したり、テーブルを変更するステートメントを実行したりするときは、通常、非同期を避けるためにテーブルにテーブル ロックを追加します。テーブル ロックには 2 つのタイプがあります。1 つは読み取りです。ロック、もう 1 つは書き込みロックです。
これら 2 つのロックをテーブルに手動で追加できます。ステートメントは次のとおりです:
lock table 表名 read(write);
ログイン後にコピー
すべてのテーブルのロックを解放します:
View locksテーブル:
show open tables;
ログイン後にコピー
読み取りロック (共有ロック) の追加:
テーブルに読み取りロックを追加すると、どのような影響がありますか?
1. 読み取りロックを追加したプロセスは、読み取りロックのあるテーブルを読み取ることができますが、他のテーブルを読み取ることはできません。
2. 読み取りロックのあるプロセスは、読み取りロックのあるテーブルを更新できません。
3. 他のプロセスは読み取りロックされたテーブルを読み取ることができ (共有ロックであるため)、他のテーブルを読み取ることもできます
4. 他のプロセスは、読み取りロックされたテーブル テーブルは常にロック待ちの状態となり、ロックが解放されるまで更新は成功しません。
書き込みロック (排他的ロック):
1. ロック プロセスは、ロックされたテーブルに対して任意の操作 (CURD) を実行できます。
2. 他のプロセスはロックされたテーブルにクエリを実行できないため、ロックが解放されるまで待つ必要があります。
概要:
読み取りロック書き込みはブロックされますが、読み取りはブロックされません。書き込みロックは読み取りと書き込みの両方をブロックします。 (プロセスに特に注意してください)
分析:
show status like 'table%';
ログイン後にコピー
上記のコマンドを入力して取得します:
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| Table_locks_immediate | 105 |
| Table_locks_waited | 3 |
+----------------------------+----------+
ログイン後にコピー
Table_locks_immediate: テーブルの数生成されたロックのレベル。ロックを即座に取得できるクエリの数を示します。ロックの値は、即時取得ごとに 1 ずつ増加します。
Table_locks_waited: テーブル レベルのロック競合が発生し、待機が発生した回数 (ロックをすぐに取得できない回数、待機ごとにロック値が 1 ずつ増加します)。より深刻なテーブルが存在することを示します レベルのロック競合状態。
2. 行ロック
特徴: InnoDB ストレージ エンジンを優先、オーバーヘッドが高く、ロックが遅い、デッドロックが発生する可能性がある、ロックの粒度は最小限であり、ロック競合の可能性は低い最低の同時実行性と最高の同時性が発生します。
行ロックはトランザクションをサポートしているため、トランザクションに関する知識は次のブログにまとめられます。
動作:
1. 行を更新しても送信しない場合、他のプロセスも行を更新するため待機する必要があります。これが行ロックです。
2. 行を更新しても、他の行を更新している他のプロセスは影響を受けません。
行ロックはテーブル ロックにアップグレードされます:
行ロックにインデックス障害が含まれる場合、テーブル ロック動作がトリガーされます。
通常、それぞれは独自の行をロックし、互いに影響しません。1 つは 2000、もう 1 つは 3000 です。
インデックスは列フィールド b に構築されるため、通常は使用されません。行ロックがテーブル ロックに変更されます。
たとえば、一重引用符が追加されていない場合、インデックスが無効になり、行ロックがテーブル ロックに変更されます。
はブロックされます。そして待ちます。 Session_1 が送信された後にのみ、ブロックが解除され、更新が完了します。
したがって、今後もインデックス クエリを有効に活用する必要があります。
ギャップ ロック:
等値条件ではなく範囲条件を使用してデータを取得し、共有ロックまたは排他ロックをリクエストすると、InnoDB は条件を満たす既存のデータを提供します。レコードのインデックス エントリはロックされます。キー値が条件範囲内にあるものの存在しないレコードの場合、それは「ギャップ」と呼ばれます。InnoDB はこの「ギャップ」もロックします。このロック メカニズムはいわゆるギャップですロック(ネクストキーロック)。
クエリが実行中に範囲検索を渡すと、キー値が存在しない場合でも、範囲全体のすべてのインデックス キー値がロックされるためです。
ギャップ ロックには致命的な弱点があります。つまり、ある範囲のキー値をロックした後、一部の存在しないキー値も無邪気にロックされてしまい、ロックされると挿入できなくなります。キー値の範囲内のデータをロックします。シナリオによっては、これによりパフォーマンスに大きな悪影響が生じる可能性があります。
最適化の提案:
不要なインデックス行ロックがアップグレードされるのを避けるために、すべてのデータ取得がインデックスを通じて完了するようにしてください。テーブルロック。
インデックスを合理的に設計し、ロックの範囲をできる限り減らします。
ギャップ ロックを避けるために、検索条件をできる限り少なくします。
トランザクション サイズを削減し、ロックされたリソースの量と時間を削減します。
可能な限り低レベルのトランザクション分離を実現します。
以上がmysqlのテーブルロックと行ロックの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。