[データベース] MySQLのテーブルロック:LOCK/ UNLOCK TABLES――ロックの仕方・解除、情報の取得
前提
テーブルロック | MyISAM, MEMORY |
行ロック | InnoDB |
ロックの種類
READロック
現セッション
読み込み(SELECT)のみ可能
書き込み(UPDATE、INSERT、DELETE)するとエラー
別セッション
読み込み(SELECT)のみ可能
書き込み(UPDATE、INSERT、DELETE)は待ち
WRITEロック
現セッション
すべて可能
別セッション
すべて待ち
書き方
テーブルのロック
[sql]
LOCK TABLES sample_table READ;
LOCK TABLES sample_table WRITE;
[/sql]
複数テーブルの場合、カンマ区切りでひとつひとつにREAD/WRITEを指定する。
[sql]
LOCK TABLES sample_table_1 READ, sample_table_2 READ;
[/sql]
単純にLOCK TABLESを複数記述すると、以前の指定が取り消される。
[sql]
LOCK TABLES sample_table_1 READ;
LOCK TABLES sample_table_2 READ;
[/sql]
この場合、sample_table_1の指定は無意味になる。
ロックの解除
[sql]
UNLOCK TABLES;
[/sql]
すべてのテーブルのロックを解除する。
テーブルのロック関連の情報取得
[bash]
mysql> SHOW STATUS LIKE 'Table%’;
+———————–+———+
| Variable_name | Value |
+———————–+———+
| Table_locks_immediate | 1151552 |
| Table_locks_waited | 15324 |
+———————–+———+
[/bash]
(MySQLリファレンスより)
Table_locks_immediate
すぐにテーブルをロックできた回数。要するに、別セッションのロックによって「待ち」状態にならなかった回数。
Table_locks_waited
テーブルをロックしようとしたときに「待ち」状態になった回数。これが多すぎる場合は、処理上の問題を抱えているということになる。
現在の状態の確認
「SHOW PROCESSLIST」
[bash]
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 1030455
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave ?
I/O thread to update it
Info: NULL
[/bash]
(MySQLリファレンスより)
アウトプットカラム「State」が「Locked」になっている場合、テーブルがロックされている。
行ロックに対してのテーブルロックの利点
(MySQLリファレンスより)
以下の場合、行レベルロックに対してテーブルロックが優勢になります。
-
テーブルのほとんどのステートメントは read です。
-
1つのキーリードで取得される1つの行に対して、write が更新もしくは削除される場合、read と write が混合となります。
UPDATE
tbl_name
SETcolumn
=value
WHEREunique_key_col
=key_value
; DELETE FROMtbl_name
WHEREunique_key_col
=key_value
; -
SELECT
が同時INSERT
ステートメントとごく少数のUPDATE
もしくはDELETE
ステートメントと混合されます。 -
writerを使用しない、全てのテーブルの
GROUP BY
オペレーションや多くのスキャン。