ホームページ >バックエンド開発 >PHPチュートリアル >MySQL データベーステーブルをロックする方法
テーブルのチェック/修復プログラムを同時に実行する場合は、MySQL サーバーとユーティリティが同時にテーブルにアクセスすることを望まないでしょう。両方のプログラムがテーブルにデータを書き込むと、明らかに多くの問題が発生し、予期しない状況が発生する可能性もあります。あるプログラムによってテーブルに書き込まれている場合、別のプログラムが同時に読み取りを行うと、混乱を招く結果が生じる可能性があります。この記事では主に、MySQL データベースのテーブルをロックする方法について説明します。
テーブルをロックする方法
クライアントリクエストの相互干渉、またはサーバーとメンテナンスプログラムの相互干渉を防ぐ方法はたくさんあります。データベースを閉じると、サーバーと myisamchk および isamchk との間の対話がなくなるようにすることができます。ただし、サーバーを停止すると、障害のないデータベースとテーブルが使用できなくなるため、サーバーを停止することはお勧めできません。このセクションで説明する主なプロセスは、サーバーと myisamchk または isamchk の間の対話を回避することです。この機能を実現するには、テーブルをロックします。
サーバーには 2 つのテーブル ロック方法があります:
1. 内部ロック
内部ロックは、クライアントのリクエストが相互に干渉するのを防ぐことができます。たとえば、クライアントの SELECT クエリが別のクライアントの UPDATE クエリによって干渉されるのを防ぎます。また、内部ロック メカニズムを使用して、myisamchk または isamchk を使用してテーブルをチェックまたは修復しているときに、サーバーがテーブルにアクセスできないようにすることもできます。
構文:
テーブルのロック: LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]
テーブルのロック解除: UNLOCK TABLES
LOCK TABLES は、現在のスレッドのテーブルをロックします。 UNLOCK TABLES は、現在のスレッドが保持しているロックを解放します。スレッドが別の LOCK TABLES を発行するか、サーバー接続が閉じられると、現在のスレッドによってロックされているすべてのテーブルのロックが自動的に解除されます。
スレッドがテーブルの READ ロックを取得した場合、そのスレッド (および他のすべてのスレッド) はテーブルからの読み取りのみが可能になります。スレッドがテーブルの WRITE ロックを取得すると、ロックを保持しているスレッドのみがテーブルの読み取りまたは書き込みを行い、他のスレッドはブロックされます。
各スレッドは、要求したすべてのロックを取得するまで (タイムアウトなしで) 待機します。
変更ができるだけ早く処理されるようにするため、通常、WRITE ロックは READ ロックよりも高い優先順位を持ちます。これは、あるスレッドが READ ロックを取得し、次に別のスレッドが WRITE ロックを要求した場合、後続の READ ロック要求は、WRITE スレッドがロックを取得して解放するまで待機することを意味します。
明らかに、チェックのために必要なのは読み取りロックを取得することだけです。さらに、Zhongqingqiaoxia はテーブルの読み取りのみが可能ですが、変更はできないため、他のクライアントがテーブルを読み取ることもできます。修復するには、テーブルの操作中にクライアントがテーブルを変更できないようにするものを入手する必要があります。
2. 外部ロック
サーバーは、外部ロック (ファイル レベル ロック) を使用して、サーバーがテーブルを使用している間に他のプログラムがファイルを変更することを防ぐこともできます。通常、サーバーはテーブル チェック操作中に myisamchk または isamchk と組み合わせて外部ロックを使用します。ただし、外部ロックは確実に機能しないため、一部のシステムでは無効になっています。 myisamchk または isamchk を実行するために選択される手順は、サーバーが外部ロックを使用できるかどうかによって異なります。使用しない場合は、内部ロック プロトコルを使用する必要があります。
サーバーが --skip-locking オプションを使用して実行されている場合、外部ロックは無効になります。このオプションは、Linux などの一部のシステムではデフォルトです。 mysql admin variables コマンドを実行すると、サーバーが外部ロックを使用できるかどうかを判断できます。 Skip_locking 変数の値を確認し、次の手順に進みます:
Skip_locking がオフの場合は、外部ロックが有効になっています。人間とユーティリティを実行してテーブルを確認できます。サーバーとユーティリティは連携してテーブルにアクセスします。ただし、いずれかのユーティリティを実行する前に、mysqladmin フラッシュ テーブルを使用する必要があります。テーブルを修復するには、テーブルの修復ロック プロトコルを使用する必要があります。
skip_locating がオンの場合、外部ロックは無効になるため、myisamchk または isamchk で修正を確認することは、サーバーがそれを認識していないことを意味するため、サーバーをシャットダウンすることが最善です。サーバーが存続する場合は、これを使用する前にクライアントがサーバーにアクセスしていないことを確認してください。他のクライアントがテーブルにアクセスできないことをサーバーに伝えるには、カード パーティのロック プロトコルを使用する必要があります。
テーブルのロックプロトコルを確認してください
このセクションでは、テーブルの内部ロックの使用方法のみを説明します。チェックテーブルのロックプロトコルの場合、この処理はテーブルのチェックのみを目的とし、テーブルの修復は行いません。
1. mysql を呼び出して次のステートメントを発行します:
$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES;
このロックにより、他のクライアントがテーブルに書き込んだり、テーブルを変更したりすることができなくなります。チェック 。 FLUSH ステートメントにより、サーバーはテーブルのファイルを閉じ、キャッシュ内にまだ書き込まれていない変更をフラッシュします。
2. チェックプロセスを実行します
$myisamchk tbl_name$ isamchk tbl_name
3. テーブルのロックを解除します
mysql>UNLOCK TABLES;
myisamchk または isamchk がテーブルの問題を検出したことを示している場合、テーブルを実行する必要があります。
上記の内容は、MySQL データベース テーブルをロックする方法について説明したものであり、皆様のお役に立てば幸いです。