Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
やってはいけない空振りdelete
SQLアンチパターンNight Part2
07/10 2017
山田 雄
ネットビジネス本部
データ基盤チーム
■山田 雄(ヤマダ ユウ)
株式会社 リクルートライフスタイル
ネットビジネス本部
データ基盤T
Twitter:@nii_yan
GitHub:https://github.com/yu-yamada
・以前はフリーランスエンジニア
縁があっ...
こんなテーブルに
mysql> select * from lock_test;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
+----+------+
こんな...
このdmlと
lockのかかり方が違うのご存知ですか?
試験環境 Mysql(5.7.18)
delete from lock_test where id = 2;
このdmlで
delete from lock_test where id =...
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
// 存在しないidをdelete
mysql> delete from lock_test where id = 100;
Query OK...
MySQLでは、存在しないindexに対し
て更新処理を行った時に発生するファ
ントム問題を回避するため、ネクスト
キーロックというよーわからん機能が
あります。
https://dev.mysql.com/doc/ref
man/5.6/ja...
Deadlock起こすパターンもあります。
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
// 存在しないid(100)をdelete
mysql> delete from lock_test where id = 100;
Que...
みなさん空振りdelete(update)はやら
ないようにしましょう。
ご清聴ありがとうございました
Prochain SlideShare
Chargement dans…5
×

やってはいけない空振りDelete

12 907 vues

Publié le

MySQLにおける空振りDeleteによるlockの違いについて

山田 雄(株式会社リクルートライフスタイル)

Publié dans : Technologie
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/2F4cEJi ❶❶❶
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • Dating for everyone is here: ♥♥♥ http://bit.ly/2F4cEJi ♥♥♥
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

やってはいけない空振りDelete

  1. 1. やってはいけない空振りdelete SQLアンチパターンNight Part2 07/10 2017 山田 雄 ネットビジネス本部 データ基盤チーム
  2. 2. ■山田 雄(ヤマダ ユウ) 株式会社 リクルートライフスタイル ネットビジネス本部 データ基盤T Twitter:@nii_yan GitHub:https://github.com/yu-yamada ・以前はフリーランスエンジニア 縁があってリクルートライフスタイルにお世話になることになった。 ビックデータ、Ruby、ビール、カップ焼きそばが好き。 自己紹介
  3. 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 | | +-------+---------------+------+-----+---------+-------------------+
  4. 4. このdmlと lockのかかり方が違うのご存知ですか? 試験環境 Mysql(5.7.18) delete from lock_test where id = 2; このdmlで delete from lock_test where id = 100;
  5. 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
  6. 6. MySQLでは、存在しないindexに対し て更新処理を行った時に発生するファ ントム問題を回避するため、ネクスト キーロックというよーわからん機能が あります。 https://dev.mysql.com/doc/ref man/5.6/ja/innodb-next-key- locking.html
  7. 7. Deadlock起こすパターンもあります。
  8. 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
  9. 9. みなさん空振りdelete(update)はやら ないようにしましょう。
  10. 10. ご清聴ありがとうございました

×