テーブルロックを待機しているセッションを終了するために、KILL
を安全に使用できます。項8.5.6.4. 「KILL
構文」
を参照してください。
INSERT DELAYED
で使用しているテーブルはロックしないでください。挿入は、ロックを保持するセッションではなく、別のスレッドによって処理される必要があるため、この場合の
INSERT DELAYED
はエラーになります。
一部の操作では、mysql
データベース内のシステムテーブルにアクセスする必要があります。たとえば、HELP
ステートメントにはサーバー側のヘルプテーブルの内容が必要であり、また
CONVERT_TZ()
でタイムゾーンテーブルを読み取る必要がある場合があります。MySQL
5.1.17
より前のバージョンでは、LOCK
TABLES
ステートメントが有効な間にこのような操作を実行するには、必要なシステムテーブルも明示的にロックする必要があります。そうしないと、ロックエラーが発生します。5.1.17
の時点では、システムテーブルの明示的なロックが必要なくなるように、サーバーが必要に応じてシステムテーブルを読み取りに対して暗黙的にロックします。これらのテーブルは、先に説明したように処理されます。
mysql.help_category mysql.help_keyword mysql.help_relation mysql.help_topic mysql.proc mysql.time_zone mysql.time_zone_leap_second mysql.time_zone_name mysql.time_zone_transition mysql.time_zone_transition_type
LOCK TABLES
ステートメントを使用して、これらのいずれかのテーブルに対する
WRITE
ロックを明示的に取得する場合は、そのテーブルが、ロックされる唯一のテーブルである必要があります。同じステートメントで、ほかのテーブルをロックすることはできません。
通常、単一の
UPDATE
ステートメントはすべて不可分であるため、テーブルをロックする必要はありません。現在実行されている
SQL
ステートメントを、ほかのセッションが妨げることはできません。しかし、テーブルをロックすることが利益をもたらす場合もいくつかあります。
MyISAM
テーブルセット上でたくさんの操作を行おうとしているのであれば、利用する予定のテーブルをロックしたほうが操作が速くできます。UNLOCK
TABLES
がコールされるまで、MySQL
はロックされたテーブルのキーキャッシュをフラッシュしないので、MyISAM
テーブルをロックすると、挿入、更新、削除のスピードを速くします。通常、キーキャッシュは各
SQL
ステートメントのあとでフラッシュされます。
テーブルロックのマイナス面は、READ
によってロックされたテーブルをどのセッションも更新できず
(ロックを保持しているセッションを含む)、ロックを保持しているセッションを除き、WRITE
によってロックされたテーブルにどのセッションもアクセスできない点です。
非トランザクションストレージエンジンに対してテーブルを使用している場合、SELECT
と UPDATE
の間にテーブルがほかのセッションによって変更されないようにするには、LOCK
TABLES
を使用する必要があります。ここに表されている例は、安全に実行するために
LOCK TABLES
を必要とします。
LOCK TABLES trans READ, customer WRITE; SELECT SUM(value) FROM trans WHERE customer_id=some_id
; UPDATE customer SET total_value=sum_from_previous_statement
WHERE customer_id=some_id
; UNLOCK TABLES;
LOCK TABLES
を使用しない場合は、SELECT
ステートメントと
UPDATE
ステートメントの実行の間に、別のセッションによって
trans
テーブルに新しい行が挿入される可能性があります。
多くの場合、相対更新
(UPDATE customer SET
)
または
value
=value
+new_value
LAST_INSERT_ID()
関数を利用することで、LOCK
TABLES
の利用を避けることができます。Transactions and Atomic Operations
を参照してください。
ユーザーレベルの通知ロック機能
GET_LOCK()
と
RELEASE_LOCK()
を利用することで、テーブルのロックを避けることができる場合があります。これらのロックははサーバー内のハッシュテーブルの中に保存され、スピードを速くする目的で
pthread_mutex_lock()
と
pthread_mutex_unlock()
を利用して実施されます。項7.11.4. 「その他の関数」
を参照してください。
ロックの規定に関しての更なる情報は 項4.3.1. 「内部ロック方法」 を参照してください。