前提・実現したいこと
- 事象
jmeterを使ってとあるAPIの負荷試験を行いました。
APIの中で以下のSQLを実行しています。
処理として、すでに存在している主キーが指定されるため、実際には1レコードに対して、連続でupdateがかかる挙動になります。
この状態で、jmeterでは分間で数千、数万と負荷をかけた時にデッドロックが発生してしまいます。
- 知りたいこと
この原因とデッドロックの解消方法
発生している問題・エラーメッセージ
CDbCommand はSQL文を実行できません。:SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction. The SQL statement executed was: ...略
実行SQL
SQL
1INSERT INTO table_name (id,date_name,product_id,num,created_at,updated_at) VALUES(99999,'2020-07-12',11111,1000,'2020-07-12 08:45:08','2020-07-12 13:45:23') ON DUPLICATE KEY UPDATE num = VALUES(num),updated_at = VALUES(updated_at)
UPDATE対象のテーブル定義
SQL
1CREATE TABLE `table_name` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `date_name` date NOT NULL, 4 `product_id` int(10) unsigned NOT NULL, 5 `num` int(11) NOT NULL, 6 `created_at` datetime NOT NULL, 7 `updated_at` datetime NOT NULL, 8 PRIMARY KEY (`id`,`date_name`), 9 UNIQUE KEY `table_name_IX1` (`date_name`,`product_id`), 10 KEY `table_name_IX2` (`product_id`) 11) ENGINE=InnoDB AUTO_INCREMENT=10248 DEFAULT CHARSET=utf8 12
補足情報(FW/ツールのバージョンなど)
mysqlバージョン
mysql Ver 14.14 Distrib 5.6.14, for Linux (x86_64) using EditLine wrapper
回答2件
あなたの回答
tips
プレビュー