% mysql --version
mysql Ver 14.14 Distrib 5.5.29, for debian-linux-gnu (x86_64) using readline 6.2
CREATE TABLE innodb_lock_monitor(a int) ENGINE=InnoDB
BEGIN
- ロックを獲得するクエリを実行
SHOW ENGINE INNODB STATUS
のTRANSACTIONS
を読むROLLBACK
-
- に戻ってクエリ実行を繰り返す
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`b`),
KEY `a` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
mysql> SELECT * FROM t;
+-----+---+
| a | b |
+-----+---+
| 16 | 1 |
| 32 | 2 |
| 48 | 3 |
| 64 | 4 |
| 80 | 5 |
+-----+---+
(おそらく主キーの全ノードに対してネクストキーロックがかかりそう)
SELECT * FROM t FOR UPDATE
a
の 16, 32, 48, 64, 80, sup にネクストキーロックPRIMARY
の 1, 2, 3, 4, 5 にレコードロック
SELECT * FROM t WHERE a IN (16, 32) FOR UPDATE
a
の 16, 32 にレコードロックPRIMARY
の 1, 2 にレコードロック
SELECT * FROM t WHERE a < 48 FOR UPDATE
a
の 16, 32, 48 にネクストキーロックPRIMARY
の 1, 2, 3 にレコードロック
SELECT * FROM t WHERE a <= 48 FOR UPDATE
a
の 16, 32, 48, 64 にネクストキーロックPRIMARY
の 1, 2, 3, 4 にレコードロック
SELECT * FROM t WHERE a >= 48 FOR UPDATE
a
の 48 にレコードロックa
の 64, 80, sup にネクストキーロックPRIMARY
の 3, 4, 5 にレコードロック
SELECT * FROM t WHERE a > 48 FOR UPDATE
a
の 64, 80, sup にネクストキーロックPRIMARY
の 1, 2, 3 にレコードロック
SELECT * FROM t WHERE a < 32 ORDER BY a DESC FOR UPDATE
a
の 16 にネクストキーロックa
の 32 の直前にギャップロックPRIMARY
の 1 にレコードロック
SELECT * FROM t WHERE a <= 32 ORDER BY a DESC FOR UPDATE
a
の 16, 32 にネクストキーロックa
の 48 の直前にギャップロックPRIMARY
の 1, 2 にレコードロック
SELECT * FROM t WHERE a >= 64 ORDER BY a DESC FOR UPDATE
a
の 48, 64, 80, sup にネクストキーロックPRIMARY
の 3, 4, 5 にレコードロック
SELECT * FROM t WHERE a > 64 ORDER BY a DESC FOR UPDATE
a
の 64, 80, sup にネクストキーロックPRIMARY
の 4, 5 にレコードロック
SELECT * FROM t WHERE a = 16 FOR UPDATE
a
の 16 にネクストキーロックa
の 32 の直前にギャップロックPRIMARY
の 1 にレコードロック
SELECT * FROM t WHERE a = 0 FOR UPDATE
a
の 16 の直前にギャップロック
SELECT * FROM t WHERE a = 20 FOR UPDATE
a
の 32 の直前にギャップロック
SELECT * FROM t WHERE a = 100 FOR UPDATE
a
の sup にネクストキーロック
(ユニークキーによる行ロックのみ)
(ユニークキーによる行ロックのみ)
SELECT * FROM t WHERE b = 1 FOR UPDATE
PRIMARY
の 1 にレコードロック
- 複合キー
- LIMIT
- JOIN
- サブクエリ