2011-08-02 79 views
0

我們有一個Web服務,用於識別車輛上發生的任何故障的XML文件。 Web服務然後使用EF 3.5將這些文件加載​​到超規範化數據庫。通常,一個XML文件在10-20秒內被處理。有兩種併發情況需要處理:鎖定表以處理實體框架3.5中的併發性

  1. 不同車輛同時發送XML文件:這不是問題。 EF的默認樂觀併發確保了我可以將所有這些文件存儲在相同的表中,因爲它們的數據是互斥的。

  2. 相同的車輛同時發送多個文件:這會產生一個問題,因爲我的系統試圖同時向數據庫寫入相同或相似的數據。這並不罕見。

我們需要點2

爲了解決這個問題的解決方案我介紹了一個鎖表。基本上,當我開始寫入數據庫時​​,我插入了一個連接的車輛ID和故障時間戳(對於同一故障,由車輛發送的多個文件相同)到此表中,並且一旦我完成就刪除記錄。但是,有很多時候這兩個文件都試圖將這一行同時插入到數據庫中。在這種情況下,一個文件成功,而另一個則拋出一個重複的密鑰異常,該異常將轉到web服務的調用者。

處理這種情況的最佳方法是什麼?我不想從db中回滾任何東西,因爲有多個表涉及單個文件。

回答

1

你期望什麼解決方案?你現在使用鎖表的方法正是你需要的。如果由於重複而導致異常被觸發,則可以等待並稍後重試,或者將類型錯誤重新發送給客戶端,並讓他稍後上傳文件。兩種解決方案都很難看,但這就是你的應用程序目前提供的。

更好的解決方案是用另一個解決方案替換當前的Web服務,其中Web服務調用只會將作業添加到隊列中,一些後臺進程將處理這些作業並確保同一車的兩個文件不會被同時處理。這也將爲偷看情況提供更好的吞吐量控制。缺點是你必須實現一些通知,說明文件已經被處理,因爲它不會在線。

+0

由於我們不能使用消息隊列,所以我猜如果鎖表中只有@Ladislav也提到最好的選擇。 – Yasir