一秒钟内选择太多 - Mysql

时间:2012-09-08 16:35:18

标签: mysql locking commit

我有一个系统每天早上都会为我和我的客户发送电子邮件。通过访问我的网站,通过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();

我需要一种方法将其锁定,以防止在同一天多次发送相同的电子邮件。

谢谢,

1 个答案:

答案 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)。对于不成功的电子邮件,您可以进行批量报告和错误处理。