More Related Content
Similar to やってはいけない空振りDelete (20)
やってはいけない空振りDelete
- 2. ■山田 雄(ヤマダ ユウ)
株式会社 リクルートライフスタイル
ネットビジネス本部
データ基盤T
Twitter:@nii_yan
GitHub:https://github.com/yu-yamada
・以前はフリーランスエンジニア
縁があってリクルートライフスタイルにお世話になることになった。
ビックデータ、Ruby、ビール、カップ焼きそばが好き。
自己紹介
- 3. こんなテーブルに
mysql> select * from lock_test;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
+----+------+
こんなデータが入ってる時
mysql> desc lock_test;
+-------+---------------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------------------+
| id | int(11) | NO | MUL | NULL | auto_increment |
| name | varchar(10) | YES | MUL | NULL | |
+-------+---------------+------+-----+---------+-------------------+
- 5. mysql> begin;
Query OK, 0 rows affected (0.00 sec)
// 存在しないidをdelete
mysql> delete from lock_test where id = 100;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into lock_test (name) values
("bb");
Query OK, 1 row affected (0.01 sec)
insertを行える
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
// 存在するidをdelete
mysql> delete from lock_test where id = 1;
Query OK, 1 rows affected (0.00 sec)
mysql> insert into lock_test (name) values
("bb");
ERROR 1205 (HY000): Lock wait timeout
exceeded; try restarting transaction
LOCKがかかりinsertが行えない
ターミナルA ターミナルB
- 8. mysql> begin;
Query OK, 0 rows affected (0.00 sec)
// 存在しないid(100)をdelete
mysql> delete from lock_test where id = 100;
Query OK, 0 rows affected (0.00 sec)
// ターミナルAの後にinsert発行するとDeadlock
mysql> insert into lock_test (name) values
("bb");
ERROR 1213 (40001): Deadlock found when
trying to get lock; try restarting transaction
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
// 存在しないid(100)をdelete
mysql> delete from lock_test where id = 100;
Query OK, 0 rows affected (0.00 sec)
// まずこちらでinsert分発行
mysql> insert into lock_test (name) values
("bb");
// ターミナルBでDeadlockが起こった後に実行され
る
Query OK, 1 row affected (2.90 sec)
ターミナルA ターミナルB