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

More Related Content

What's hot

What's hot (20)

MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
cloudpackサーバ仕様書(サンプル)
cloudpackサーバ仕様書(サンプル)cloudpackサーバ仕様書(サンプル)
cloudpackサーバ仕様書(サンプル)
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 

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

沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
Hideki Saito
 
Control distribution of virtual machines
Control distribution of virtual machinesControl distribution of virtual machines
Control distribution of virtual machines
irix_jp
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
Kensuke Nagae
 
ふくよかなモデル
ふくよかなモデルふくよかなモデル
ふくよかなモデル
yukaina
 

Similar to やってはいけない空振りDelete (20)

MySQL clients
MySQL clientsMySQL clients
MySQL clients
 
今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7
 
ヤフーのRDBと最新のMySQLの検証結果#yjdsw3
ヤフーのRDBと最新のMySQLの検証結果#yjdsw3ヤフーのRDBと最新のMySQLの検証結果#yjdsw3
ヤフーのRDBと最新のMySQLの検証結果#yjdsw3
 
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
 
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityWhat's New in MySQL 5.7 Security
What's New in MySQL 5.7 Security
 
Control distribution of virtual machines
Control distribution of virtual machinesControl distribution of virtual machines
Control distribution of virtual machines
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうMySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
 
MariaDB 10.3 概要
MariaDB 10.3 概要 MariaDB 10.3 概要
MariaDB 10.3 概要
 
道具を磨くことのススメ
道具を磨くことのススメ道具を磨くことのススメ
道具を磨くことのススメ
 
私とmysqlとROLE
私とmysqlとROLE私とmysqlとROLE
私とmysqlとROLE
 
Index shotgun on mysql5.6
Index shotgun on mysql5.6Index shotgun on mysql5.6
Index shotgun on mysql5.6
 
MariaDB meetup Tokyo 2019 #01
MariaDB meetup Tokyo 2019 #01MariaDB meetup Tokyo 2019 #01
MariaDB meetup Tokyo 2019 #01
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
JOSUG 34th Meetup
JOSUG 34th Meetup JOSUG 34th Meetup
JOSUG 34th Meetup
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
 
ふくよかなモデル
ふくよかなモデルふくよかなモデル
ふくよかなモデル
 

More from Yu Yamada

More from Yu Yamada (12)

Google cloudnext recap_DataAnalytics
Google cloudnext recap_DataAnalyticsGoogle cloudnext recap_DataAnalytics
Google cloudnext recap_DataAnalytics
 
リクルートライフスタイルが考える、万人に使ってもらえる分析基盤の作り方
リクルートライフスタイルが考える、万人に使ってもらえる分析基盤の作り方リクルートライフスタイルが考える、万人に使ってもらえる分析基盤の作り方
リクルートライフスタイルが考える、万人に使ってもらえる分析基盤の作り方
 
Step functionsとaws batchでオーケストレートするイベントドリブンな機械学習基盤
Step functionsとaws batchでオーケストレートするイベントドリブンな機械学習基盤Step functionsとaws batchでオーケストレートするイベントドリブンな機械学習基盤
Step functionsとaws batchでオーケストレートするイベントドリブンな機械学習基盤
 
ここがつらいよAws batch
ここがつらいよAws batchここがつらいよAws batch
ここがつらいよAws batch
 
オンプレ、クラウドを組み合わせて作るビックデータ基盤 データ基盤の選び方
オンプレ、クラウドを組み合わせて作るビックデータ基盤  データ基盤の選び方オンプレ、クラウドを組み合わせて作るビックデータ基盤  データ基盤の選び方
オンプレ、クラウドを組み合わせて作るビックデータ基盤 データ基盤の選び方
 
リクルートライフスタイルの売上を支える共通分析基盤
リクルートライフスタイルの売上を支える共通分析基盤リクルートライフスタイルの売上を支える共通分析基盤
リクルートライフスタイルの売上を支える共通分析基盤
 
kafkaのデータをRedshiftへ入れるパイプライン作ってみた
kafkaのデータをRedshiftへ入れるパイプライン作ってみたkafkaのデータをRedshiftへ入れるパイプライン作ってみた
kafkaのデータをRedshiftへ入れるパイプライン作ってみた
 
Uuidはどこまでuuidか試してみた
Uuidはどこまでuuidか試してみたUuidはどこまでuuidか試してみた
Uuidはどこまでuuidか試してみた
 
リクルートライフスタイルのデータを支える技術
リクルートライフスタイルのデータを支える技術リクルートライフスタイルのデータを支える技術
リクルートライフスタイルのデータを支える技術
 
オンプレとクラウドのHadoopを比較して僕の思うとこ
オンプレとクラウドのHadoopを比較して僕の思うとこオンプレとクラウドのHadoopを比較して僕の思うとこ
オンプレとクラウドのHadoopを比較して僕の思うとこ
 
僕の考える最強のビックデータエンジニア
僕の考える最強のビックデータエンジニア僕の考える最強のビックデータエンジニア
僕の考える最強のビックデータエンジニア
 
CDH4->5 update苦労話
CDH4->5 update苦労話CDH4->5 update苦労話
CDH4->5 update苦労話
 

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