进行数据库操作并向电子邮件发送事务

时间:2012-07-23 10:30:55

标签: php mysql email

我有一个预订酒店的网站。预订成功后,将发送一封电子邮件给客户。我做了如下:

- Update table "booking"
- Check the result
   + If true, send email
   + Else return error

但如果没有发送电子邮件怎么办?已插入数据库但未发送电子邮件。这使得预订操作不对。 如何进行数据库操作和发送电子邮件交易?有没有简单的方法呢? A和B必须成功或不成功。

4 个答案:

答案 0 :(得分:5)

严格意义上的交易不能延伸数据库中的内部以及数据库中的外部。所以我们必须重新定义“交易”,要么所有行动都失败,要么全部成功。

这是一个想法:

  • 启动数据库事务
    • 更新表格“预订”
    • 将撤消记录写入表格,状态为“已更新,未发送”。这需要一些ID,可用于撤消预订
  • 提交数据库事务
  • 如果失败,请纾困(无需回滚)

  • 发送电子邮件

  • 如果这样可以
    • 删除撤消记录
    • 返回“成功”
  • 否则
    • 使用撤消记录撤消预订
    • 删除撤消记录
    • 返回“错误”

有两件事需要理解:

  • 在操作系统崩溃,电源输出等情况下,您必须手动检查撤消表并将其与邮件服务器日志进行比较:崩溃可能发生在邮件刚刚失败或邮件刚刚发送但不是记录
  • 最重要的:我还没有看到一个快速的机制,可靠地告诉您电子邮件是否已发送。 我的意思是真的发送,而不是在某个地方加入

答案 1 :(得分:4)

如果您使用的是InnoDB,则可以使用数据库事务:

伪代码:

Start DB transaction
Update table "booking"
Check the result
If true, send email
If email sends, commit your transaction
Else rollback your transaction, and return error

有关此处交易的更多信息:http://dev.mysql.com/doc/refman/5.0/en/commit.html

答案 2 :(得分:2)

  

但如果没有发送电子邮件怎么办?已插入数据库但未发送电子邮件。这使得预订操作不对。如何进行数据库操作和发送电子邮件交易?有没有简单的方法呢? A和B必须成功或不成功。

好吧,我会说:启动一个事务,将数据输入数据库并测试是否成功。如果成功,请发送电子邮件。如果数据输入和发送电子邮件都成功,则提交事务。如果其中一个未成功,请回滚该事务。

那说;没有可靠的方法来确定电子邮件是否已成功传送到电子邮件地址。您可以检查接受服务器的SMTP状态代码,但这并不能保证您的电子邮件不会在以后退回。

答案 3 :(得分:0)

您可以通过在主表

上添加其他列status_flag DEFAULT 0来实现此目的

步骤:

1. Update table "booking" SET col1 = val1, status_flag = 1 WHERE tr_id = "abc"

2. Send Email

3. Update table "booking" SET status_flag = 2 WHERE tr_id = "abc"

因此,如果您在预订表中发现status_flag值为1的任何记录,则这些记录可能是发送电子邮件失败的记录。

因此,您可以从同一脚本重新发送电子邮件,也可以添加另一个cron-job脚本来识别失败的条目并采取相应的操作。

相关问题