Mysqlロックテーブル/ロック解除構文
4781 ワード
6.7.2
MySQL 4.0.2で
1つのスレッドが1つのテーブルには、ロックされたすべてのテーブルを内部定義の順序でソートする(ユーザの立場から言えば、この順序は明確ではない). テーブルが1つのリードロックと1つのライトロックでロックされている場合、ライトロックはリードロックの前に置かれます. は一度に1つのテーブルのみをロックし、スレッドにのみすべてのロックを取得します.
このスキームは、テーブルロックのデッドロックが解放されることを確認するためです.このモードについては、まだ他のことを知っておく必要があります.
テーブルに対して
通常、すべての単一多くの操作を1つのテーブルで実行している場合は、使用するテーブルをロックすると、より速くなります.もちろん、他のスレッドは、 MySQLでトランザクションをサポートしないストレージエンジンを使用している場合は、
増分更新(
ユーザー・レベルのロック関数
ロックスキームの詳細については、セクション5.3.1 MySQLは表をロックする方法を参照してください.
注:
LOCK TABLES/UNLOCK TABLES
構文LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
LOCK TABLES
は、現在のスレッドロックテーブルです.UNLOCK TABLES
は、現在のスレッドが所有するすべてのロックを解放します.スレッドが別のLOCK TABLES
を発行するか、サーバとの接続が閉じられると、現在のスレッドによってロックされているすべてのテーブルが自動的にロック解除されます.MySQL 4.0.2で
LOCK TABLES
を使用するには、グローバルなLOCK TABLES
権限と関連テーブル上のSELECT
権限が必要です.MySQL 3.23では、このテーブルにはSELECT
、insert
、DELETE
、UPDATE
、LOCK TABLES
の権限が必要です.READ
を使用する主な理由は、トランザクションを模倣したり、テーブルを更新したりする際により高速になるためです.後でもっと詳しく説明します.1つのスレッドが1つのテーブルに
WRITE
ロックを取得した場合、スレッド(および他のすべてのスレッド)はテーブルからのみ読み出されます.1つのスレッドが1つのテーブルにREAD LOCAL
ロックを得た場合、このロックを有するスレッドのみがテーブルからテーブルを読み取り、書き込みすることができる.他のスレッドがブロックされています.READ
とREAD LOCAL
の違いは、ロックがロードされると、INSERT
が非衝突(non-conflicting)LOCK TABLES
文の実行を許可することである.ロックをロードしている間にMySQLの外部からデータベースファイルを操作すると、まだ使用できません.WRITE
を使用する場合は、使用するすべてのテーブルをロックし、クエリーで使用する別名と同じ名前を使用する必要があります.クエリーでテーブル(別名)を複数回使用する場合は、別名ごとにロックを取得する必要があります.READ
ロックは、READ
ロックよりも高い権限を有することによって、更新が迅速に処理されることを保証する.これは、1つのスレッドがWRITE
ロックを取得し、同時に別のスレッドがREAD
ロックを要求する場合、同時のWRITE
ロック要求はLOW_PRIORITY WRITE
スレッドがロックされ、解放されるまで待機することを意味する.WRITE
ロックを使用して、スレッドがREAD
ロックを待っている間に、他のスレッドがLOW_PRIORITY WRITE
ロックを取得することを許可します.READ
ロックのみを使用する必要があります.これが最後になると確信したら、スレッドがないとLOCK TABLES
ロックがあります.LOW_PRIORITY WRITE
は次のように動作します.このスキームは、テーブルロックのデッドロックが解放されることを確認するためです.このモードについては、まだ他のことを知っておく必要があります.
テーブルに対して
READ
ロックを使用すると、これは、スレッドがWRITE
ロックを要求しないまでMySQLがこのロックを待つことを意味します.スレッドがWRITE
ロックされ、ロックテーブルリスト内の次のテーブルのロックが取得されるのを待つと、他のすべてのスレッドはKILL
ロックが解放されるのを待つ.これがアプリケーションで深刻な問題を引き起こす場合は、いくつかのテーブルをトランザクション・セキュリティ・テーブルに変換することを考慮する必要があります.KILL
を使用して、テーブルがロックされているスレッドを安全に殺すことができます.章4.5.5 INSERT DELAYED構文を参照してください.INSERT
を使用しているテーブルをロックするべきではありません.これは、この場合、UPDATE
が個別のスレッドによって完了するためである.通常、すべての単一
READ
文が原子であるため、テーブルをロックする必要はありません.他のスレッドは、現在実行されているSQL文に干渉できません.どうしてもテーブルをロックしたい場合は、次のような場合があります.WRITE
ロックのテーブルを更新することができず、LOCK TABLES
ロックのテーブルを読み取る他のスレッドはありません.UNLOCK TABLES
では、いくつかのことがより速く実行される理由は、MySQLがMyISAM
が呼び出されるまでロックされたテーブル・キー・キャッシュをダンプ・パージしないためです(通常、キー・キャッシュはSQL文ごとにダンプ・パージされます).これにより、SELECT
テーブルでの挿入、更新、削除が加速します.UPDATE
とLOCK TABLES
の間に他のスレッドが表示されないことを確認したい場合は、LOCK TABLES
を使用する必要があります.次の例は、安全に実行するために、ここではLOCK TABLES
:mysql> LOCK TABLES trans READ, customer WRITE;
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql> UPDATE customer SET total_value=sum_from_previous_statement
-> WHERE customer_id=some_id;
mysql> UNLOCK TABLES;
が必要であり、SELECT
文およびUPDATE
文の実行中に、trans
表に新しいレコードを挿入する別のスレッドが発生する可能性があることを示している.増分更新(
UPDATE customer SET value=value+new_value
)またはLAST_INSERT_ID()
関数を使用すると、LOCK TABLES
の使用を避けることができます.ユーザー・レベルのロック関数
GET_LOCK()
およびRELEASE_LOCK()
を使用して、サーバ上のハッシュ・テーブルに保存され、pthread_mutex_lock()
およびpthread_mutex_unlock()
で実装され、高速度を得ることもできます.章6.3.6.2補助機能関数を参照してください.ロックスキームの詳細については、セクション5.3.1 MySQLは表をロックする方法を参照してください.
FLUSH TABLES WITH READ LOCK
コマンドを使用して、すべてのデータベース内のすべてのテーブルを読み込みロックできます.章4.5.3 FLUSH構文を参照してください.Veritasなどのファイルスナップショットをタイムリーに確立できるファイルシステムがあれば、バックアップを得るのに非常に便利です.注:
LOCK TABLES
はトランザクションが安全ではありません.テーブルをロックしようとする前に、すべてのアクティブなトランザクションが自動的にコミットされます.