LoginSignup
5
7

More than 5 years have passed since last update.

バッチ処理の多重実行を確実に回避する

Last updated at Posted at 2016-08-09

例えば、メールを100人に送る。
このバッチ処理がなんらかの形で多重に実行されてしまうと
同じ人に何度もメールがいって怒られます。

バッチ処理そのものを同時実行できなくする方法もあると思いますが
バッチ処理そのものは多重実行を許可したい。でも同じ人に同じ処理はまずい。
そんなときは、下記方法で回避できます。

table作成
CREATE TABLE IF NOT EXISTS unique_log(id VARCHAR(32) NOT NULL UNIQUE)
send.php
foreach($mails as $mail){

  //一意にしたいIDを作成する。たとえば送信先と日にちとタイトル
  $id = md5($mail->to . $mail->date . $mail->tilte);
  if(!$pdo->query('SELECT id FROM unique_log WHERE id = ?', $id)
  and $pdo->insert('unique_log', ['id'=>$id])
  and $pdo->query('SELECT id FROM unique_log WHERE id = ?', $id)){

    sendMail($mail);
  }
}

・そういうログがない
・そういうログがインサートできる
・そういうログがインサートできた
ならば、処理を開始してよいという判断です。

これが多重に処理開始されてしまう状態とは、
ユニークなカラムに同じ値を、複数のプロセスから多重insertできたということですから
mysqlのテーブルがぶっこわれたときだけです。

[追記]
mpywさんの下記記述がより良いと思います!

5
7
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7