質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JMeter

Apache JMeterとは、Webアプリケーションの負荷テストをするためのJavaアプリケーションです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

3559閲覧

mysql5.6でキー指定のUPDATE文を連続で実行した時にデッドロックが発生

ryau

総合スコア2

JMeter

Apache JMeterとは、Webアプリケーションの負荷テストをするためのJavaアプリケーションです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/07/10 09:18

編集2020/07/10 09:33

前提・実現したいこと

  • 事象

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/07/10 09:37

トランザクションはどうしていますか?
ryau

2020/07/10 09:44

APIのリクエストごとにトランザクションを使用しています。
sazi

2020/07/10 11:48

検証後の当該のテーブルにnsertで追加を行って、IDを確認してみて下さい。 欠番は生じていますか?
guest

回答2

0

ベストアンサー

数万回APIを叩いているのであればその数セッションが開かれるので
負荷が高いかもしれません
おなじセッション内の同じトランザクションで処理すれば数万回の作業でも
たかが知れてます

投稿2020/07/10 10:53

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/07/10 10:56 編集

たとえばこんなテスト create table tbl (id int primary key,val int); insert into tbl values (1,100),(2,200),(3,300); これにプロシージャを設定 drop procedure if exists proc; delimiter // create procedure proc(IN num int,IN max int,IN done tinyint) begin start transaction; set @count=1,@id=num,@max=max,@done=done; while @count<=@max do update tbl set val=val+1 where id=@id; set @count=@count + 1; end while; if @done=1 then commit; else rollback; end if; end // delimiter ; 仕様:procは引数を3つもち 第1引数はtblのidを指定 第2引数は繰り返し回数を指定 第3引数は1ならcommit、そうでなければrollback
yambejp

2020/07/10 10:58 編集

テスト1 call proc(1,100000,1); マシンにもよりますが5-10秒でid=1のvalが100100になります テスト2 call proc(2,100000,0); マシンにもよりますが5-10秒待ってロールバックされるので元のままです
yambejp

2020/07/10 11:39

命題のテーブル見ましたがprimaryの取り方も変ですし 複合ユニークしたキーの片方にインデックスを更にはったり いまいち効率的な運用がされていないようにみえます
guest

0

質問の前に、
date, datetime の値はシングルクォーティングしないとエラーになるのでは?

SQL

1INSERT ... 2VALUES(99999,2020-07-12,11111,1000,2020-07-12 08:45:08,2020-07-12 13:45:23) 34VALUES(99999,'2020-07-12',11111,1000,'2020-07-12 08:45:08','2020-07-12 13:45:23') 5 ...

投稿2020/07/10 09:29

編集2020/07/10 09:30
Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryau

2020/07/10 09:33

SQL修正しました。記載ミスで実際のクエリに問題はありません。
Orlofsky

2020/07/10 10:58

もっとINSERT文がどんな使われているのか周りの部分も載せた方が適切なコメントが付きそうです。 INSERT毎にCOMMIT できる案件でしたら、パフォーマンスは落ちるけど、INSERT毎にCOMMITしてみては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問