2011-10-25 23 views
0

我在數據庫表(MySQL)中創建了一個電子郵件隊列。每一行都是一封包含收件人,發件人等的電子郵件。每分鐘自動調用一次腳本,它會檢索未發送的郵件併發送它們,並將每封郵件的「發送」列設置爲true。如何確保DB行只更新一次?

我需要確保每條消息只發送一次。但是,如果腳本運行很長,另一個腳本可能會檢索這些消息併發送它們而不知道它們將由另一個腳本發送。

目前,我一次將行數限制爲50,以便縮短腳本運行時間。但這並不能保證。我相信有更好的方法。

謝謝。

山姆

回答

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); 
    

您還需要釋放已經被使用時間過長的消息(因爲承擔它們的過程可能會崩潰)。

這太麻煩了,有一些第三方郵件查詢,如PEAR's Mail_Queue