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

推薦する

パスワードログインなしでCentOS7にxshellリモートログインするアイデアを詳しく解説

まず、全体的な考え方についてお話しします。 1. パスワードを使用してCentOSシステムにログイン...

メタタグのビューポートはデバイス画面のCSSを制御します

コードをコピーコードは次のとおりです。 <meta name="viewport&q...

TypeScript のマップされた型とより優れたリテラル型推論について説明します。

目次概要マップされた型を使用して Object.freeze() を構築するマッピングタイプの構文は...

実践的な経験を共有するためのコードチェックツールstylelintの紹介

目次序文文章1. stylelintをインストールする2. 設定ファイル3. stylelintを使...

ウェブサイトはいつ広告を掲載すべきでしょうか?

最近、インターネットのベテランと「広告」について議論したのですが、彼から非常に興味深い意見を聞きまし...

vue-qr を使用して Vue の QR コードを生成する方法について深く理解する

目次npm ダウンロードステップ(1)輸入(2)vue-qrパラメータ例要約する「QRコード」の英語...

最新の仮想マシン VMware 14 インストール チュートリアル

まず、VMware 14のアクティベーションコードをお渡ししますFF31K-AHZD1-H8ETZ-...

Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

質問LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...

M1 チップに MySQL 8.0 データベースをインストールする方法 (画像とテキスト)

1. ダウンロードまず、MySQLの国内ミラーをお勧めします。特に速いわけではありませんが、それで...

Centos7.5 は mysql5.7.24 バイナリ パッケージの展開をインストールします

1. 環境整備:オペレーティング システム: CentOS Linux リリース 7.5.1804 ...

操作例 MySQL ショートリンク

MySQL ショートリンクの設定方法1. mysql 接続番号ステートメントコマンドを確認します。 ...

Mysql の mysql.user ユーザー テーブルの詳細な説明

MySQL は、異なるユーザーに異なる権限を割り当てることができるマルチユーザー管理データベースであ...

仕事の効率を上げるJS略語スキル20選

目次複数の変数を同時に宣言する場合は、1 行に短縮できます。分割代入は複数の変数に同時に値を割り当て...

FirefoxでCookieとお気に入りをインポートおよびエクスポートする方法

Firefox は、多くの拡張機能とプラグインを備えた、よく使用されるブラウザです。IE に比べて多...