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を使用して、頻繁に表示される奇妙なボタンを簡単に実装します。

推薦する

mysql ワイルドカード (sql 高度なフィルタリング)

目次まず、値の一部と一致させるために使用される特殊文字であるワイルドカードについて簡単に紹介します。...

Dockerは単一のイメージを使用して複数のポートにマッピングします

必要:公式サイトのリソースサーバーは確かに1つのインスタンスでは使えず、複数のインスタンスを一緒に使...

小規模プログラムへのデータキャッシュ機構の応用と実装

ミニプログラムデータキャッシュ関連知識データ キャッシュ: データをキャッシュして、アプレットを終了...

黒、白、グレーの控えめでエレガントなウェブデザインを鑑賞

クラシックな色の組み合わせの中でも、黒、白、グレーの時代を超えた魅力を否定できる人はおそらくいないで...

JavaScript の便利な配列トリック 12 選

目次アレイ重複排除1. from() を新しい Set() メソッドに重ねる2. スプレッド演算子 ...

HTMLは入力完了を検出する機能を実装する

入力が進行中かどうかを検出するには、「onInput(event)」を使用しますコンテンツが変更され...

Linux で open-vswitch をインストールおよびアンインストールする方法

1. ソースコードからovsをコンパイルしてインストールします。依存関係をインストールします: # ...

CSSカスケーディングメカニズムについての簡単な説明

CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...

レンダリング関数と JSX の詳細

目次1. 基本2. ノード、ツリー、仮想DOM 1. 仮想DOM 3. createElementパ...

4つのReactコンポーネントにおけるDOMスタイル設定の詳細な説明

1. インラインスタイル仮想DOMにインラインスタイルを追加するには、式を使用してスタイルオブジェク...

HTML外部参照CSSファイルが効果を発揮しない理由の分析と解決

フロントエンドの初心者として、私は数日間フロントエンドをいじってみました。 。今日、私は自分が固く信...

サブメニューをクリックする効果を実現するJavaScript

この記事では、クリック時にサブメニューを表示するためのJavaScriptの具体的なコードを参考まで...

tomcat9.exeをクリックするとクラッシュする問題を解決する方法

ある読者から連絡があり、ダウンロードが終了し、操作がまだ開始されていないのに、なぜ Tomcat の...

グリッドはページのレイアウトプランです

<br /> 英語原文: http://desktoppub.about.com/od/...

Better-scrollはメニューとコンテンツをリンクする効果を実現します

1. 基本的な使い方 <!DOCTYPE html> <html lang=&qu...