0

私はデータベース トランザクションに不慣れで、非常にわかりにくいことがわかりました。メールアドレス、送信日時、送信日時を含むキューテーブルがあります。私のcronジョブは常に起動し、「送信日時」が渡された行を選択しています。アドレスに電子メールを送信し、「送信日時」列を更新します。

この cron ジョブがまったく同時に起動された場合、それらが同じ行を取得して、電子メールを 2 回送信する可能性があります。

私が理解していることから、トランザクションはすべて成功または失敗、またはクエリに依存しています。このシナリオでそれを確認するにはどうすればよいですか?

$this->db->trans_begin();

$query = $this->db->query('SELECT * FROM Queue_table where send >= now LIMIT 100');

foreach ($query->result() as $row)
{
   //code to send email to $row->email;
   $this->db->query('UPDATE Queue_table SET sent = now WHERE id = '$row->id'');
}

//the following doesn't make much sense to me. What would cause
// this to be false in this scenario?

if ($this->db->trans_status() === FALSE)
{
    $this->db->trans_rollback();
}
else
{
    $this->db->trans_commit();
}

私はこれを完全に間違っていますか?

4

0 に答える 0