PHP・MySQL・PDO・シェルスクリプトで質問です。MySQLからPDOで大量にINSERTする場合、MySQL・PDOではINSERTが完了していないのにPHPは次行へ移動することはありますか?あるとすれば移動しないようにする対策はありますか?

外部からフォルダへデータファイルが新しく置かれたら(←A)Aを一度にMySQLへINSERTするPHP(←B)と、INSERT内容を元に編集するPHP(←C)を作りました。
これらを円滑且つ重複なく稼働する為、CRONから1分毎に呼び出されるシェルスクリプトでは上記各処理の動作中フラグがなければ、それぞれ呼び出す形にし、その際Bを呼び出す行下にはフラグファイル(B')を作成することで、Cの冒頭ではB'がなければ起動できないようにしました。
これでBが完了しなければCに進めないようにしたところ、確かにA→B→C順に動いたのですが、場合によってBでMySQLへINSERT中?にCへ進む場合がありました。結果C判定が異常になる場合が発生しています。
とりあえずCの手前にSleepを入れて対応しますが、根本的解決ではないので悩んでいます、
以上、抽象的な話で恐縮ですが、何かアドバイスいただければ幸いです。よろしくお願い致します。
ちなみにPHP5.3.3・Mysql14.14です。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/10/28 19:55:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:degucho No.1

回答回数281ベストアンサー獲得回数75

ポイント167pt

SQL実行に失敗したまま続行している可能性があります。
http://piyopiyocs.blog115.fc2.com/blog-entry-657.html
エラーコードを拾うか、Exceptionを拾ってみてください

id:halohalolin

deguchoさんありがとうございます。
エラーは出ませんでした。

2016/10/22 12:02:49
id:phplove No.2

回答回数20ベストアンサー獲得回数6

ポイント167pt

Bの処理が多重で動くことはないでしょうか?
Aのファイルが時間差で置かれたような場合とか。
Bの処理が動いているときは次のBの処理もブロックする必要があるかと思います。

id:phplove

あとトランザクション使った方が良いです。

2016/10/24 21:31:55
id:halohalolin

phploveさんありがとうございます。
ログによると、Bが多重で動いていることはないようです。
ただ今までAが時間差で置かれたこともないですが。

Bの処理が動いているときは次のBの処理もブロックする処理は入れています。
トランザクションも入れています。

2016/10/27 09:31:59
id:victor_victor No.3

回答回数31ベストアンサー獲得回数5

ポイント166pt

実際のソースを見てみないと何とも言えませんがCが終了しないうちに次のBが動いているのではないかと思います。
cronで定期的に起動するのはBだけにしておいて、BからCを呼び出す形にするべきです。
Bを呼び出す際には、BもCも動作中ではないことを確認するようにします。

他2件のコメントを見る
id:halohalolin

ビ=ヨンセさんありがとうございます。

incronは初耳でした!
参考にさせていただきます。

2016/10/28 09:08:38
id:victor_victor

ひとつまえのコメントは私ではありませんw
私の想定ではAはcronでの起動だろうと考えておりました。
きっちりとデータを置いたときの同期を取りたいのであれば、ファイルがあるかどうかの監視ではなく、なにかしらのプログラムを動かして「ファイルを置いた」というトリガーを受け付けてBの処理を起動するべきだとおもいます。
Bの処理をPHPで書くならApacheの元で動作させることができるわけですから、HTTPでリクエストを出してもらえばいいのではないかと思います。

2016/10/28 22:06:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません