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”でも発生します。
関連記事
コメントを残す