innodb_lock_monitorを有効にする
有効にする場合
CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB;
そして、
SHOW ENGINE INNODB STATUS;
と打てば、TRANSACTIONSのセクションの中に、ロックの詳細情報が入るようになる。
終わったら、テーブルを落とす。
DROP TABLE innodb_lock_monitor;
項目
TRANSACTIONの項目をみてみる
サンプルのテーブル
CREATE TABLE `test_lock` ( `id` bigint(20) unsigned NOT NULL, `count` tinyint(3) unsigned DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
試したSQL
UPDATE test_lock SET count = count +1 WHERE id IN (3,13);
結果
TABLE LOCK table `test`.`test_lock` trx id 19883768 lock mode IX
これは、lock mode IX(インテンション排他ロック)というテーブルロックがかかっている。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.3 InnoDB のロックモード
RECORD LOCKS space id 64731 page no 3 n bits 88 index `PRIMARY` of table `test`.`test_lock` trx id 19883768 lock_mode X locks rec but not gap
このケースでは、locks rec but not gap
-> レコードロック、ギャップロックではない。
ロックは、
Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 8; hex 0000000000000003; asc ;; 1: len 6; hex 0000012f66f8; asc /f ;; 2: len 7; hex 040000034d2a36; asc M*6;; 3: len 1; hex 02; asc ;; Record lock, heap no 8 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 8; hex 000000000000000d; asc ;; 1: len 6; hex 0000012f66f8; asc /f ;; 2: len 7; hex 040000034d2a5a; asc M*Z;; 3: len 1; hex 02; asc ;;