我有一个预订酒店的网站。预订成功后,将发送一封电子邮件给客户。我做了如下:
- Update table "booking"
- Check the result
+ If true, send email
+ Else return error
但如果没有发送电子邮件怎么办?已插入数据库但未发送电子邮件。这使得预订操作不对。 如何进行数据库操作和发送电子邮件交易?有没有简单的方法呢? A和B必须成功或不成功。
答案 0 :(得分:5)
严格意义上的交易不能延伸数据库中的内部以及数据库中的外部。所以我们必须重新定义“交易”,要么所有行动都失败,要么全部成功。
这是一个想法:
如果失败,请纾困(无需回滚)
发送电子邮件
有两件事需要理解:
答案 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脚本来识别失败的条目并采取相应的操作。