Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
やってはいけない空振り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)はやら
ないようにしましょう。
ご清聴ありがとうございました
Nächste SlideShare
Wird geladen in …5
×

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

12.915 Aufrufe

Veröffentlicht am

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

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

Veröffentlicht in: Technologie
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/2F4cEJi ❶❶❶
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Dating for everyone is here: ♥♥♥ http://bit.ly/2F4cEJi ♥♥♥
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

やってはいけない空振り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. ご清聴ありがとうございました

×