現在のロックタイムアウト時間を調べるには:
SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
下記のような出力になる:
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+
つまり、グローバル設定上はinnodb_lock_wait_timeout
が50秒ってこと。
注意:
lock_wait_timeout
という設定でもあるが、そっちはmetadata lock
に使用されています。innodb_lock_wait_timeout
が正しいです。
処理時タイムアウトを個別に変えたい時にSET <設定変数名> = <値>;
を書けば良い:
START TRANSACTION;
SET innodb_lock_wait_timeout = 3; # タイムアウト(秒)、このトランザクションは3秒しかLockを待たない
<処理>
COMMIT;
上記のクエリー発行しても、グローバルの設定は変えられることがない。
DEAD LOCK
が発生しやすい処理はinnodb_lock_wait_timeout
を適切に下げると、データベースへの負荷ある程度下げることができる。
(そもそもDEAD LOCK
頻発ならコードデザインの見直しをすべき)