代码之家  ›  专栏  ›  技术社区  ›  Adriano Oliveira

一秒钟内选择过多-Mysql

  •  0
  • Adriano Oliveira  · 技术社区  · 12 年前

    我有一个每天早上为我和我的客户发送电子邮件的系统。这个过程是通过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 回复  |  直到 12 年前
        1
  •  1
  •   Gordon Linoff    12 年前

    你所拥有的是一种种族状况。有很多方法可以解决这个问题,有些方法比其他方法更稳健。“稳健”意味着保证永远不会有重复的电子邮件。

    这是一个 易于理解的 方法在表中添加第二个日期列:SendStart。将发送开始设置为现在() 之前 您尝试发送电子邮件并将WHERE子句更改为:

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