また使う気がするのでメモ。
valの先頭1文字でインデックスになっているので、"[t]wo"のロックは"[t]hree"も一緒にロックする。
よってnum = 3のロックは不可能。
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のロックは不可能。