在不使用max_execution_time的情况下使操作成为原子

时间:2012-10-12 17:49:05

标签: php mysql algorithm atomic

我已经设置了一个cron作业(PHP脚本),它执行以下工作:

1. Read all of the unseen emails, using imap
   1.1  For each email readed
   1.2. Fetches the details and save detail in database
   1.3. Moves email to other mailbox named "Processed"
   1.4. Goto step 1.1

但如果PHP脚本停止或失败执行,在步骤1.2之后但在1.3之前,则电子邮件将 重新处理 ,这是问题

众所周知,处理时间取决于许多因素,例如服务器负载和要处理的电子邮件数量,因此我认为设置max_execution_time不会有所帮助。

我如何制作这种原子?有任何想法吗? (如果您对不同的流程有任何想法,我也可以更改流程。)

编辑:假设电子邮件已移动,它刚刚提交,但PHP脚本会停止?然后会发生的是电子邮件将在没有存储记录的情况下移动。

1 个答案:

答案 0 :(得分:0)

您可以将步骤1.2放入数据库事务中,然后如果步骤1.3失败,您将回滚该事务。

如果你有一个事务,并且没有显式调用“commit”(即通过超时,或者你只是忘了调用commit),那么它会自动被假定为回滚。