我有一个系统每天早上都会为我和我的客户发送电子邮件。通过访问我的网站,通过iframe自动触发此过程。
通常,我会收到两次相同的电子邮件。
我在MySQL数据库上创建的简单过程控制如下:
运行此查询:
选择发送我的电子邮件的客户
SELECT name, email FROM clients WHERE DATE_FORMAT(lastsend, '%d/%m/%y') <> DATE_FORMAT(now(), '%d/%m/%y')
发送电子邮件的功能
我使用vb.net发送电子邮件
发送所有电子邮件后更新表客户端
UPDATE clients SET lastsend = Now();
我需要一种方法将其锁定,以防止在同一天多次发送相同的电子邮件。
谢谢,
答案 0 :(得分:1)
你所拥有的是一种竞争条件。有很多方法可以解决这个问题,有些方法比其他方法更强大。 “健壮”意味着保证永远不会有重复的电子邮件。
这是简单方式。在表中添加第二个日期列:SendStart。在尝试发送电子邮件并将WHERE子句更改为:
之前,将send start设置为now()WHERE DATE_FORMAT(lastsend, '%d/%m/%y') <> DATE_FORMAT(now(), '%d/%m/%y') and
DATE_FORMAT(sendstart, '%d/%m/%y') <> DATE_FORMAT(now(), '%d/%m/%y')
您仍然可以在第一个查询和第二个查询之间获得竞争条件。但是,时间跨度要小得多,因此可能性要小得多。
最后,您将记录发送电子邮件的时间以及是否已发送电子邮件(除非发送成功,否则不设置lastsend)。对于不成功的电子邮件,您可以进行批量报告和错误处理。