MySQLロック

多くの場合、MySQLの動作原理が議論されます。 このhabratopikは、MySQLで使用されるロックメカニズム専用です。 このトピックは、初心者がMySQLを学び、ある程度は経験豊富なhabra-peopleを学ぶのに役立ちます。



MySQLロックメカニズム



複数のクライアントがデータウェアハウスに同時にアクセスすると、さまざまなタイプのエラーが発生する可能性があります。 たとえば、あるクライアントによる同時読み取りと、テーブル内の同じ行の別のクライアントによる書き込みは、失敗または誤ったデータの読み取りにつながる可能性があります。 ロックメカニズムにより、データへの同時アクセスの状況を回避し、ユーザー間の相互作用のメカニズムを調整できます。



クライアントの1つに代わってMySQLは特定のリソースをロックしますが、他のクライアントはロックが解除されるのを待ちます。 ロックは、テーブルレベル(テーブルがロックされている)または行レベル(特定のテーブル行がブロックされている)で実行できます。 MyISAMストレージエンジン(デフォルトで使用)はテーブルロックを実装し、InnoDBエンジンは行ベースのロックを使用します。 InnoDBストレージは構造化され、マルチバージョンデータをサポートしますが、MyISAMでは、データファイルの構造はテーブル行の単純な列挙であり、ストレージの構造を複雑にすることで行ごとのロックが実現されます。 したがって、InnoDBは、より複雑なストレージのメンテナンスに必要な損失にもかかわらず、マルチスレッドデータが同じテーブルに変更されるアプリケーションで勝ちます。



ロックには、読み取りと書き込みの2つのタイプがあります。
  1. Aがデータを読み取りたい場合、他のクライアントもデータを読み取ることができますが、Aが読み取りを完了するまで(読み取りロック)誰も書き込むことができません。
  2. Aがデータを書き込みたい場合、他のクライアントは、Aが終了するまで(書き込みロック)、このデータを読み書きしないでください。
ロックは明示的または暗黙的に課すことができます。
  1. クライアントがロックを明示的に割り当てない場合、MySQLサーバーは式またはトランザクションの実行中に必要なタイプのロックを暗黙的に設定します。 たとえば、SELECTステートメントを実行する場合、サーバーはREAD LOCKを設定し、UPDATEの場合、WRITE LOCKを設定します。 暗黙的なロックの場合、ロックレベルはデータストレージのタイプによって異なります。MyISAM、MEMORY、およびMERGEの場合、InnoDBの場合、テーブル全体がロックされます-式で使用される行のみ(これらの行のセットが主キー値によって一意に決定できる場合-それ以外の場合、テーブル全体がロックされます) )
  2. 多くの場合、この時点で他のクライアントの介入なしに、いくつかの要求を連続して実行する必要があります。 暗黙的なロックは、単一のリクエストの期間のみ設定されるため、これらの目的には適していません。 この場合、クライアントはLOCK TABLESおよびUNLOCK TABLES式を使用してロックを明示的に割り当ててからキャンセルできます。 明示的なロックは、ストレージメカニズムに関係なく、常にテーブル全体をロックします。

明示的ロックの使用



明示的なロックの場合、1回限りのロックの割り当てと、ロック時まで更新されたインデックスの書き込みの遅延により、パフォーマンスが向上します。 明示的なロックを割り当てるとき、テーブル名とロックのタイプが示されます:LOCK TABLES Country READ、City WRITE; UNLOCK TABLESステートメントには引数がなく、現在のセッションで明示的に設定されたすべてのロックを削除します。



明示的ロックの次の機能に注意してください。 ロックの種類: :システム変数concurrent_insertsは、読み取り用にロックされたMyISAMテーブルの最後にデータを追加できるかどうかを決定します。 デフォルトでは、この変数は1です。これは、テーブルに穴がない場合にデータを追加できることを意味します。 したがって、暗黙的なロックが発生した場合、READではなくMyISAMテーブルに対してREAD LOCALが設定されます。 concurrent_insertsの値を0にすると、読み取りと並行してデータが追加されなくなります。値を2にすると、テーブルに穴があってもテーブルの最後にデータを挿入できます。



おわりに



この記事では、MySQLでロックを使用する際の基本的な問題のみを取り上げています。 トランザクション、分離レベル、アドバイザリーロックなどはカバーされていません。興味のある質問をコメントに記入してください。



Webewを使用したMySQLのクロスポストロック



All Articles