Quantcast
Channel: 日々の覚書
Viewing all articles
Browse latest Browse all 581

InnoDBのロックは行ロックじゃなくてインデックス行ロックだからね、という例

$
0
0
また使う気がするのでメモ。

mysql1> CREATE DATABASE d1;
mysql1> USE d1;
mysql1> CREATE TABLE t1 (num SERIAL, val VARCHAR(32), KEY (val(1))) ENGINE = InnoDB;
mysql1> INSERT INTO t1 VALUES (1, 'one'), (2, 'two'), (3, 'three');
mysql1> START TRANSACTION;
mysql1> SELECT * FROM t1 WHERE val = 'two' FOR UPDATE;

mysql2> SELECT * FROM t1 WHERE num = 3 LOCK IN SHARE MODE;

valの先頭1文字でインデックスになっているので、"[t]wo"のロックは"[t]hree"も一緒にロックする。
よってnum = 3のロックは不可能。

Viewing all articles
Browse latest Browse all 581

Trending Articles