私はデータベース トランザクションに不慣れで、非常にわかりにくいことがわかりました。メールアドレス、送信日時、送信日時を含むキューテーブルがあります。私の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();
}
私はこれを完全に間違っていますか?