DBに関する不具合について教えてくださいの仕事

見積もり募集の結果

募集期間

5日間

提案数

4件

閲覧数

179回

実際の発注内容

実際の支払金額
6,000 円 ~ 7,000
実際の受注者
実際のスケジュール
依頼作成
発注先決定
5日
入金(作業開始)
5日
納品完了
13日
(作業開始から8日)

見積もり募集の内容

依頼の目的・背景
phpプログラムでDBをアップデートするプログラムを書いています。
分からない事が出てきたので、質問させてください。

環境は以下の通りです。
PHP 7.0.21 (cli)
CentOS release 6.9 (Final)
mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper

php PDO で mysql にアクセスしています。
とある長めのトランザクションコードがあります。
そこのコードのロック機構に問題があるようです。

2台のクライアントソフトで、そのトランザクションをほぼ同時に実行すると、応答しなくなって(フリーズ)しばらくすると
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
上記のエラーが出力されます。

----------------------------------------------------------------
問題が起きた時のコード

■ クライアント1
begin
select * from bbb where id=123 AND dflg=0 for update;



update bbb set dflg=1 where id=123;
update bbbccc set dflg=1 where bbbid=123; <- ここで止まっていた



commit

■ クライアント2
begin
select * from bbb where id=124 AND dflg=0 for update;



update bbb set dflg=1 where id=124;
update bbbccc set dflg=1 where bbbid=124; <- ここで止まっていた



commit

----------------------------------------------------------------

他にもテーブルやコードはありますが、テーブルロックや行ロックは行っていません。

bbbid=123の対象となる3レコード(仮にbbbccc.id=456,457,458)と、bbbid=124の対象となる3レコード(仮にbbbccc.id=459,460,461)は全く別のレコードとなります。
(ただし、bbbccc.id は連続(456,457,458,459,460,461)ではあります)

(質問①)
なぜ両方のクライアントが止まってしまったのか理解できません。
説明をお願いできればと思います。

(質問②)
select ~ for update に代わり、get_lock , is_used_lock を採用するかもしれません。
get_lock は全く知らないので、その辺りも含めて何度かやり取りさせていただき、質問させていただければと思います。

----------------------------------------------------------------

DBの設計やレコードの情報などは添付ファイルをご覧ください。
(添付ファイル:ss20181217.png)
開発の進捗状況
分からないので、相談して決めさせていただければと思います。
開発の継続性
分からないので、相談して決めさせていただければと思います。
重視する点
クオリティ、柔軟な対応、こまめな連絡
希望開発言語
MySQL
補足説明
設定なし