MySQLロックメカニズム
複数のクライアントがデータウェアハウスに同時にアクセスすると、さまざまなタイプのエラーが発生する可能性があります。 たとえば、あるクライアントによる同時読み取りと、テーブル内の同じ行の別のクライアントによる書き込みは、失敗または誤ったデータの読み取りにつながる可能性があります。 ロックメカニズムにより、データへの同時アクセスの状況を回避し、ユーザー間の相互作用のメカニズムを調整できます。
クライアントの1つに代わってMySQLは特定のリソースをロックしますが、他のクライアントはロックが解除されるのを待ちます。 ロックは、テーブルレベル(テーブルがロックされている)または行レベル(特定のテーブル行がブロックされている)で実行できます。 MyISAMストレージエンジン(デフォルトで使用)はテーブルロックを実装し、InnoDBエンジンは行ベースのロックを使用します。 InnoDBストレージは構造化され、マルチバージョンデータをサポートしますが、MyISAMでは、データファイルの構造はテーブル行の単純な列挙であり、ストレージの構造を複雑にすることで行ごとのロックが実現されます。 したがって、InnoDBは、より複雑なストレージのメンテナンスに必要な損失にもかかわらず、マルチスレッドデータが同じテーブルに変更されるアプリケーションで勝ちます。
ロックには、読み取りと書き込みの2つのタイプがあります。
- Aがデータを読み取りたい場合、他のクライアントもデータを読み取ることができますが、Aが読み取りを完了するまで(読み取りロック)誰も書き込むことができません。
- Aがデータを書き込みたい場合、他のクライアントは、Aが終了するまで(書き込みロック)、このデータを読み書きしないでください。
- クライアントがロックを明示的に割り当てない場合、MySQLサーバーは式またはトランザクションの実行中に必要なタイプのロックを暗黙的に設定します。 たとえば、SELECTステートメントを実行する場合、サーバーはREAD LOCKを設定し、UPDATEの場合、WRITE LOCKを設定します。 暗黙的なロックの場合、ロックレベルはデータストレージのタイプによって異なります。MyISAM、MEMORY、およびMERGEの場合、InnoDBの場合、テーブル全体がロックされます-式で使用される行のみ(これらの行のセットが主キー値によって一意に決定できる場合-それ以外の場合、テーブル全体がロックされます) )
- 多くの場合、この時点で他のクライアントの介入なしに、いくつかの要求を連続して実行する必要があります。 暗黙的なロックは、単一のリクエストの期間のみ設定されるため、これらの目的には適していません。 この場合、クライアントはLOCK TABLESおよびUNLOCK TABLES式を使用してロックを明示的に割り当ててからキャンセルできます。 明示的なロックは、ストレージメカニズムに関係なく、常にテーブル全体をロックします。
明示的ロックの使用
明示的なロックの場合、1回限りのロックの割り当てと、ロック時まで更新されたインデックスの書き込みの遅延により、パフォーマンスが向上します。 明示的なロックを割り当てるとき、テーブル名とロックのタイプが示されます:LOCK TABLES Country READ、City WRITE; UNLOCK TABLESステートメントには引数がなく、現在のセッションで明示的に設定されたすべてのロックを削除します。
明示的ロックの次の機能に注意してください。
- クライアントは明示的なロックを保持しますが、他のテーブルは使用できません。したがって、LOCK TABLESステートメントを再利用すると以前に行ったロックがキャンセルされるため、必要なすべてを一度に(1つの式で)ロックする必要があります。
- ロックは、バージョン5.0.6以降の表示(VIEW)に設定できます。 以前のバージョンでは、ビューに含まれるすべてのテーブルにロックを設定する必要があります。
- 接続の終了またはセッションの終了により、このセッションのフレームワーク内で確立されたすべてのロックが自動的に削除されます。
- テーブルのロックはトランザクションによって破られる可能性があり、逆もまた同様です。 START TRANSACTIONは暗黙的にUNLOCK TABLESを実行し、逆の場合はLOCK TABLESは不完全なトランザクションをロールバックします。
- ロックを設定するには、ロックする各テーブルに対するLOCK TABLESおよびSELECT権限が必要です。
- 必要なテーブルの1つが別のセッションでロックされている場合、すべてのテーブルが解放されるまでロックステートメントは実行されません。
- READ-読み取りのためにテーブルをロックします。 すべてのクライアントは同時にデータを受信できますが、ロックを設定したクライアントも含め、誰もデータを変更できません。
- WRITE-書き込みのためにテーブルをロックします。 ロックを設定したクライアントのみがデータを受信および変更できます。
- READ LOCAL-読み取りのためにテーブルをロックしますが、データ挿入(INSERT)は許可します。 行の変更または削除によって形成されたホールのないMyISAMテーブルにのみ適用されます。 この場合、新しいデータがテーブルの最後に追加されます。 テーブルに穴がある場合は、OPTIMIZE TABLEステートメントを使用して修正できます。
- LOW_PRIORITY WRITE-書き込みのためにテーブルをロックしますが、ロックを待機している間、READロックを受け取るためにキューに入れられているクライアントをスキップします。 ロックを待機している間、新しい着信READタイプのロックリクエストも前方にスキップされます。
おわりに
この記事では、MySQLでロックを使用する際の基本的な問題のみを取り上げています。 トランザクション、分離レベル、アドバイザリーロックなどはカバーされていません。興味のある質問をコメントに記入してください。
Webewを使用したMySQLのクロスポストロック 。