如何确保数据库行只更新一次?

时间:2011-10-25 16:45:53

标签: mysql

我在数据库表(MySQL)中创建了一个电子邮件队列。每行都是一封包含收件人,发件人等的电子邮件。每分钟自动调用一个脚本,它会检索未发送的邮件并发送它们,并将每封邮件的“已发送”列设置为true。

我需要确保每封邮件只发送一次。但是如果脚本运行很长时间,另一个脚本可能会检索消息并发送它们而不知道它们将由另一个脚本发送。

目前,我一次将行数限制为50,以便缩短脚本运行时间。但这并不能保证。我相信有更好的方法。

感谢。

萨姆

1 个答案:

答案 0 :(得分:1)

构建可靠的作业队列并不容易。您肯定需要存储比“已发送/未发送”更多的信息。我能想到的最低限度是“约会日期”和“发送日期”。交付流程应该:

  1. 选择一些可用的消息:

    START TRANSACTION;
    
    SELECT message_id
    FROM message
    WHERE date_taken IS NULL AND date_sent IS NULL
    ORDER BY message_id
    LIMIT 5
    FOR UPDATE;
    
  2. 将它们标记为处理:

    UPDATE message
    SET date_taken=NOW()
    WHERE message_id IN (101, 102, 103, 104, 105);
    
    COMMIT;
    
  3. 完成后,将其标记为已发送:

    UPDATE message
    SET date_sent=NOW()
    WHERE message_id IN (101, 102, 103, 104, 105);
    
  4. 您还需要释放已经花费太长时间的消息(因为它们可能会崩溃的过程)。

    这太麻烦了,还有像PEAR's Mail_Queue这样的第三方邮件查询。