2011-03-14 61 views
0

我正在使用WCF服務,該服務需要是每個呼叫服務來處理負載,但服務中有某些方法需要線程安全。如何使用WCF PerCall服務保護資源

例如

void CreateCustomer(Customer customer) 
{ 
//If customer does not exists in DB 
    //Create customer 
} 

我很擔心,如果有兩個呼叫創造客戶(以相同的細節),我的風險有兩個客戶在數據庫中創建,當我真的只希望之一。

有沒有辦法解決這個問題,同時讓我的服務保持每個呼叫?

+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地設置格式和語法突出顯示它! – 2011-03-14 06:13:56

+0

您如何知道客戶存在兩次?您數據庫中的客戶編號字段?只要在它上面加一個'UNIQUE'約束!這樣,無論有多少併發呼叫嘗試創建該客戶,只有一個可以存在於您的數據庫中 – 2011-03-14 06:15:20

回答

3

您正在混淆線程安全性與數據庫併發性。 PerCall服務不會引起線程安全問題,除非您在服務例程中產生多個線程(您應該避免這種情況)。

您的問題應該改寫爲您在插入期間關注客戶表上的數據庫一致性和併發性(例如,未查看其他人創建的客戶)。

在關係數據庫中有一種非常標準化的方式來滿足處理此問題的ACID屬性(原子性,一致性,隔離性和持久性):將檢查/插入包裝在事務中。

寫一個存儲過程(比如說CreateCustomerIfNotExists)有一個事務並檢查某個客戶ID是否存在,並在表中插入一個新行(如果它不存在)會更好。

關係數據庫的ACID屬性會自動防止您害怕發生的事情。

相關問題