【问题标题】:Too many selects in a second - Mysql一秒钟内选择太多 - Mysql
【发布时间】:2012-09-02 04:31:25
【问题描述】:

我的系统每天早上都会为我和我的客户发送电子邮件。此过程是通过 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();

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

谢谢,

【问题讨论】:

    标签: mysql locking commit


    【解决方案1】:

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

    这是一个简单的方法。在表中添加第二个日期列:SendStart。将发送开始设置为 now() 之前您尝试发送电子邮件并将 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,除非发送成功)。您可以对不成功的邮件进行批量上报和错误处理。

    【讨论】:

    • 感谢戈登·林诺夫。我会尝试做这个,稍后再发布结果。
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 2022-06-22
    • 2021-05-12
    • 1970-01-01
    • 2015-11-02
    • 2011-09-29
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多