ロックメソッドそれぞれについての説明は付録にあります。 See 項E.4. 「ロック方法」。
InnoDB
型と BDB
型のテーブルを除き、MySQL
のロックはすべてデッドロックフリーです。
これは、常にクエリの開始時に必要なすべてのロックを要求し、また、常に同じ順序でテーブルをロックすることによって管理されます。
InnoDB
型のテーブルは、行ロックを自動的に取得し、BDB
型のテーブルは、トランザクションの開始時ではなく
SQL
ステートメントの処理時にページロックを自動取得します。
MySQL は WRITE
ロックに以下のロック方法を使用します。
テーブルにロックがない場合は、書き込みロックを配置する。
その他の場合は、書き込みロックキューにロック要求を配置する。
MySQL は READ
ロックに以下のロック方法を使用します。
テーブルに書き込みロックがない場合は、読み取りロックを配置する。
その他の場合は、読み取りロックキューにロック要求を配置する。
ロックが解除されると、まず書き込みロックキューのスレッドでロックが使用可能になり、その後読み取りロックキューのスレッドで利用可能になります。
これは、1
つのテーブルに対して更新が多数ある場合に、更新がすべてなくなるまで
SELECT
ステートメントが待機することを意味します。
テーブルに対して多数の INSERT
および SELECT
操作を行う必要がある場合、このような待機を回避するには、テンポラリテーブルにレコードを挿入し、一定の間隔でテンポラリテーブルからのレコードで実テーブルを更新します。
これは以下のコードで実行できます。
mysql>LOCK TABLES real_table WRITE, insert_table WRITE;
mysql>INSERT INTO real_table SELECT * FROM insert_table;
mysql>TRUNCATE TABLE insert_table;
mysql>UNLOCK TABLES;
特定の状況で取り出しに優先順位を設定するには、LOW_PRIORITY
オプションを
INSERT
、UPDATE
または
DELETE
に、あるいは
HIGH_PRIORITY
オプションを
SELECT
に使用します。また、--low-priority-updates
オプションで mysqld
を開始しても同じ効果が得られます。
SQL_BUFFER_RESULT
の使用もテーブルロックを短縮するのに役立ちます。
See 項6.4.1. 「SELECT
構文」。
さらに、1 つのキューを使用するように
mysys/thr_lock.c
のロックコードを変更することもできます。この場合は、書き込みロックと読み取りロックの優先度が同じになり、アプリケーションによっては高速化に役立ちます。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.