尋找如何解決這個問題的想法。這裏的交易:頭腦風暴解決方案---發送雙重電子郵件
我們有一個向我們發送公司零星這些坐在目錄中的文件。在我們這邊,我們有一個windows服務來監視那個目錄中的任何傳入文件。一旦服務運行並找到文件,它就會執行代碼來開始處理所述文件。該目錄一次可以有1到n個文件。因此,例如,我們可能有1000個文件出現在目錄中,並且Windows服務會查看這些文件,並啓動將數據存入數據庫併發送電子郵件的過程。
該進程運行多線程和異步。它抓取一個文件,將數據放入數據庫,然後發送電子郵件給某人。這裏的問題在於,當兩個進程正在運行並且它們都在打相同的代碼時,有時會爲同一個人生成2個電子郵件。方法如下:
- 轉到數據庫,看看我們有沒有聯繫。
- 是的,他在那裏,好吧,檢查'郵件標誌欄'...有郵件發送給他?
- 不,好吧,給他發一封電子郵件,並將'email flag column'標記爲YES(bool)。
發生了什麼事情是2線程在同一時間點擊此方法並同時讀取代碼。都查看數據庫並查看「電子郵件標誌列」是否。然後他們發送電子郵件並將列標記爲YES。但是,由於這種情況發生得太快,線程(A)在線程(B)讀取列之前沒有機會標記數據庫列。
我想過如果兩個線程在這個方法中背靠背,我們會放入一些代碼來'等待'。就像一個LOCK。但我們不能那樣做。我現在唯一的解決方案是不發送電子郵件。並有一個控制檯應用程序在一天的特定時間運行,併發送電子郵件給那些在該列中有0(否)的人。一旦電子郵件被髮送,然後我們將這些列標記爲1(是)。
它可能不是最好的解決辦法,這就是爲什麼我在這裏,讓你們中的一些怪異嚇人的聰明人來幫我想一些性感的解決方案。
如果您正在閱讀和更新數據庫,則使用事務處理是針對類似於您的場景的常見和可證明的解決方案。 – Filburt
順便說一句:SO不是論壇;它是一個問答網站。 –