====== 15 InnoDB テーブルロック ====== ※ユニーク制約 or インデックスが張られているカラムで検索した場合以外はテーブルロックになってしまう mysql> select * from lock_test; +----+--------+-----+ | id | name | age | +----+--------+-----+ | 1 | tanaka | 20 | | 2 | suzuki | 30 | | 3 | sato | 40 | +----+--------+-----+ 3 rows in set (0.02 sec) create table lock_test ( id int primary key auto_increment, name varchar(32) not null, age int not null ) engine=innoDB default charset=utf8; insert into lock_test (name, age) values ('tanaka', 20), ('suzuki', 30), ('sato', 40); mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE lock_test SET age = 21 WHERE name = 'tanaka'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE lock_test SET age = 31 WHERE name = 'suzuki'; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql> show global variables like '%innodb_lock_wait_timeout%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | innodb_lock_wait_timeout | 50 | +--------------------------+-------+ 1 row in set (0.02 sec) ===== インデックス張っている方は行ロックとなる ===== mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE lock_test SET age = 21 WHERE id=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE lock_test SET age = 31 WHERE id=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 {{tag>InnoDB mysql}}