[MySQL]ロックタイムアウト時間を変更する (ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction)

MySQLでInnoDBを使用している場合、ロックタイムアウトの時間は、innodb_lock_wait_timeoutパラメータで管理されています。
このパラメータは、MySQL5.5の場合セッション単位で指定する事が可能です。

実際にどの様な振る舞いをするかを実験してみました。

準備

CREATE TABLE test01 (
	key1	INT,
	key2	INT,
	VALUE   INT,
	PRIMARY KEY( key1, key2 )
) ENGINE=innodb;



セッション1

-- トランザクション開始
mysql> START TRANSACTION;
Query OK, 0 ROWS affected (0.00 sec)
 
 
-- データを登録
mysql> INSERT INTO test01 VALUES( 1, 6, 100 );
Query OK, 1 ROW affected (0.00 sec)



セッション2

-- トランザクション開始
mysql> START TRANSACTION;
Query OK, 0 ROWS affected (0.00 sec)
 
-- 現在のロックタイムアウト値(デフォルトは50sec)
mysql> SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | VALUE |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
1 ROW IN SET (0.00 sec)
 
 
-- ロックタイムアウトを5秒に変更
mysql> SET innodb_lock_wait_timeout=5;
Query OK, 0 ROWS affected (0.00 sec)
 
 
mysql> SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | VALUE |
+--------------------------+-------+
| innodb_lock_wait_timeout | 5     |
+--------------------------+-------+
1 ROW IN SET (0.00 sec)
 
-- insert文を実行するとタイムアウトエラーが発生
--  ERROR 1205は5秒後に表示される。
mysql> INSERT INTO test01 VALUES( 1, 6, 100 );
ERROR 1205 (HY000): LOCK wait timeout exceeded; try restarting TRANSACTION




ロックタイムタイムアウトはセッションごとで指定できるため、上記の作業を行った後セッション1でinnodb_lock_wait_timeoutをチェックしても50秒のままです。

mysql> SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | VALUE |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
1 ROW IN SET (0.00 sec)




insertのロックは、デフォルトのisolation levelだと”insert into”だけでなく
“insert ignore into”でも発生します。

関連記事

コメントを残す

メールアドレスが公開されることはありません。