InnoDBの行ロック

トランザクションのロック待ちでタイムアウトしてしまうことがある。

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

mysql> use app
Database changed
mysql> create table lock_test (
-> id int primary key auto_increment,
-> name varchar(32) not null,
-> value int not null
-> ) engine = innoDB default charset=utf8;
Query OK, 0 rows affected (0.55 sec)

mysql> insert into lock_test (name, value) values (‘tanaka’, 80),(‘suzuki’, 30),(‘sato’, 50),(‘takahashi’, 40);
Query OK, 4 rows affected (0.07 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from lock_test;
+—-+———–+——-+
| id | name | value |
+—-+———–+——-+
| 1 | tanaka | 80 |
| 2 | suzuki | 30 |
| 3 | sato | 50 |
| 4 | takahashi | 40 |
+—-+———–+——-+
4 rows in set (0.00 sec)

コマンドラインを二つ立ち上げて、同時にupdateしようとすると、片方が止まります。これがlock wait

片方をcommitすると、以下のメッセージが出ます。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

カラムが異なればロックされない。
インデックスだと、ロックされる。
update lock_test set value = value + 10 where name = ‘tanaka’;