MySQLのさまざまなロックに関する詳細な理解

MySQLのさまざまなロックに関する詳細な理解

ロックの概要

ロックは、コンピューターが複数のプロセスまたはスレッドを調整してリソースにアクセスするためのメカニズムです。

データベースでは、従来のコンピュータ リソース (CPU、RAM、I/O など) の競合に加えて、データは多くのユーザーが共有するリソースでもあります。同時データ アクセスの一貫性と有効性を保証するには、すべてのデータベースが解決しなければならない問題です。ロックの競合も、データベースの同時アクセス パフォーマンスに影響を与える重要な要素です。この観点から、ロックはデータベースにとって特に重要で、より複雑です。

ロックの分類

データベース操作の粒度

テーブルロック:
	操作中は、テーブル行ロック全体がロックされます。
	操作中は現在の操作ラインがロックされます。

データ操作の種類

読み取りロック(共有ロック):
	同じデータに対して、互いの書き込みロック (排他ロック) に影響を与えることなく、複数の読み取り操作を同時に実行できます。
	操作が完了するまで、他の書き込みロックと読み取りロックがブロックされます。

MySQL ロック

他のデータベースと比較すると、MySQL のロック メカニズムは比較的単純です。最も注目すべき特徴は、異なるストレージ エンジンが異なるロック メカニズムをサポートしていることです。

さまざまなストレージエンジンでサポートされるロックレベル

ストレージエンジンテーブルロック行レベルロックページロック
マイISAMサポートサポートされていませんサポートされていません
翻訳サポートサポートサポートされていません
メモリサポートサポートされていませんサポートされていません
イギリスサポートサポートされていませんサポート

ロックの紹介

どのロックが優れているかを一概に言うことは困難です。特定のアプリケーション シナリオに基づいて、どのロックがより適しているかを分析する必要があります。

ロックタイプ特徴
テーブルロックオーバーヘッドが低く、ロックが高速な MyISAM ストレージ エンジンが優先されます。デッドロックは発生しません。ロックの粒度が大きく、ロック競合を送信する可能性が最も高く、同時実行性が最も低くなります。
行レベルロックオーバーヘッドが高く、ロックが遅い InnoDB ストレージ エンジンになる傾向があります。デッドロックが発生する可能性があります。ロックの粒度が最も小さく、ロック競合の可能性が最も低く、同時実行性が最も高くなります。
ページロックオーバーヘッドとロック時間はテーブル ロックと行ロックの間であり、デッドロックが発生する可能性があります。ロックの粒度はテーブル ロックと行ロックの間であり、同時実行性は平均的です。

MyISAM テーブルロック

テーブルロックを追加する方法

クエリ ステートメント (選択) を実行する前に、MyISAM は関連するすべてのテーブルを自動的にロックします。更新操作 (更新、削除、挿入など) を実行する前に、関連するテーブルに書き込みロックを自動的に追加します。このプロセスでは、ユーザーの介入は必要ありません。したがって、通常、ユーザーは LOCK TABLE コマンドを直接使用して MyISAM テーブルを明示的にロックする必要はありません。

ロック解除

読み取りロックを追加します:
	テーブル table_name の読み取りをロックします。 
	---テーブルのロックを解除します。
書き込みロックを追加:
	テーブル table_name の書き込みをロックします。
	書き込みロックを追加します。現在のセッションは読み取りと書き込みが可能で、他のセッションはブロックされます (待機中)。読み取りロックは書き込みを制限し、書き込みロックは読み取りと書き込みを制限します。

ロック競合

1. MyISAM テーブルに対する読み取り操作は、同じテーブルに対する他のユーザーの読み取り要求をブロックしませんが、同じテーブルに対する書き込み要求をブロックします。
2. MyISAM への書き込み操作は、テーブル 1 に対する他のユーザーの読み取りおよび書き込み操作をブロックします。
3. MyISAM ロックのスケジュールは書き込み優先です。
	メインテーブルとしては適していません。ロックを書き込んだ後、他のスレッドによる大量の更新により、クエリがロックを取得することが困難になり、永続的なブロックが発生する可能性があります。

ロックの使用

ロックの使用状況を確認し、開いているテーブルを表示します。
テーブルのロック状態を確認します。「table_locks%」のような状態が表示されます。
		Table_locks_immediate: テーブルレベルのロックが取得できる回数。即時ロックが取得されるたびに、値が 1 ずつ増加します。
		Table_locks_waited: ロックをすぐに取得できない場合に待機する必要がある回数。待機するたびに値が 1 ずつ増加します。これは、テーブル レベルのロック競合の重大度を判断するために使用できます。	

InnoDB ロック

InnoDBとMyISAMの最大の違いは、まずトランザクションをサポートしていること、次に行レベルのロックを使用していることです。

行ロック

共有ロック:
	読み取りロックとも呼ばれるこのロックは、複数のトランザクションで共有できますが、読み取りのみ可能で、排他ロックへの書き込みはできません。
	書き込みロックとも呼ばれるロックは共有されません。ロックを取得できないトランザクションは、読み取りおよび書き込み操作を実行できません。更新、削除、および挿入ステートメントが実行されると、innoDB は関連するデータ セットに排他ロックを自動的に追加します。異なる選択ステートメントにはロックは追加されません。ロックはクエリに明示的に追加されます。共有ロックを追加します。
		select * from table_name where ... 共有モードでロック
	排他ロックを追加します。
		table_name から * を選択します。ここで ... 更新用

ロックのエスカレーション

インデックス障害、行ロックがテーブルロックにアップグレードされ、その背後にインデックスがない場合、行ロックもテーブルロックにアップグレードされます。

ギャップロック

InnoDBはギャップに存在しないデータもロックします。これをギャップロックと呼びます。

ロック競合

'innodb_row_lock%' のようなステータスを表示します。
	Innodb_row_lock_current_waits 現在待機中のロックの数 Innodb_row_lock_time ロックの合計期間 Innodb_row_lock_time_avg ロックの平均期間 Innodb_row_lock_time_max ロックの最大期間 Innodb_row_lock_waits システムが起動してからの待機の合計数

要約する

innoDB ストレージ エンジンは行ロックを実装します。ロック メカニズムの実装によって生じるパフォーマンス消費はテーブル ロックよりも高くなる可能性がありますが、全体的な同時処理能力の点では MyISAM テーブル ロックよりもはるかに優れています。システムの同時処理が比較的高い場合、InnoDB の全体的なパフォーマンスは MyISAM よりも明らかに優れています。

最適化の提案

非インデックス行ロックをテーブル ロックにアップグレードすることを回避するために、すべてのデータ取得がインデックスを介して完了するようにしてください。インデックスを合理的に設計し、ロックの範囲を最小限に抑えます。ギャップ ロックを回避するために、インデックス条件とインデックス範囲を最小限に抑えます。トランザクション サイズを制御し、ロックされるリソースの量と時間の長さを削減します。可能な限り、低レベルのトランザクション分離を使用します (ビジネス ニーズを満たす必要があります)。

さまざまな MySQL ロックの詳細な理解に関するこの記事はこれで終わりです。より関連性の高い MySQL ロック コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL 悲観的ロックと楽観的ロックの実装
  • MySQLのロック機構に関する最も包括的な説明
  • MySQLの関連ロックについての簡単な理解

<<:  Ubuntu 18.04 で apt ソースを Alibaba Cloud ソースに変更する詳細なプロセス

>>:  CSSを使用して、頻繁に表示される奇妙なボタンを簡単に実装します。

推薦する

DockerでMongoDBコンテナをデプロイする方法

目次Dockerとは展開する1. イメージをプルする2. 画像を表示する3. コンテナを実行する4....

MySQLのジョイントインデックス機能の分析と使用例

この記事では、例を使用して、MySQL 共同インデックスの機能と使用方法を説明します。ご参考までに、...

シンプルな時計を実装するJavaScript

この記事では、JavaScriptでシンプルな時計を実装するための具体的なコードを参考までに紹介しま...

セマンティック XHTML タグの紹介

まず最初に指摘しておきたいのは、人間は視覚的な区分を通じてコン​​テンツの意味を判断できるが、検索エ...

Nginx プロセス スケジューリングの問題の詳細な説明

Nginx は、マスター プロセス (MasterProcess) と、同じ数のホスト CPU コア...

CentOS7 で jar アプリケーションの起動を設定する方法

プロジェクトの展開中に遭遇した落とし穴Zhihudemo を展開する際、Jenkins などの自動展...

MySQLはこのような更新文を決して書きません

目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...

Linuxにソフトウェアをインストールするいくつかの方法の詳細な説明

1. RPM パッケージのインストール手順: 1. soft.version.rpm などの対応する...

一般的なブラウザ互換性の問題(概要)

ブラウザの互換性とは、スタイルの互換性 (CSS)、インタラクションの互換性 (JavaScript...

divとtableの選択と組み合わせ方について簡単に説明します

ページレイアウトは、Web ページを扱い始めた頃からずっと気にかけていたことです。初期のテーブル構造...

Linux で起動時にプログラムを自動的に実行させる最も簡単な方法

たくさん集めましたが、すべて失敗に終わりました。最終的に、この方法は優れており、使用に影響を与えない...

JS を使用して配列内の要素の存在を 10 分で判断する

序文フロントエンド開発では、配列内に要素が存在するかどうかを判断する必要があることがよくあります。実...

長いデータを HTML で表示するときに処理する方法

HTML で長いデータを表示する場合、マウスをその上に移動するとデータを切り捨てて完全なデータを表示...

Vueはランニングライトのシンプルな効果を実現

この記事では、マーキーのシンプルな効果を実現するためのVueの具体的なコードを参考までに共有します。...