CubicLouve

Spring_MTの技術ブログ

MySQL 5.6でロックの状態を詳細に見たい場合

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  ;;