2012-06-14 21 views
0

我想知道如何與實體框架4(ODAC)編程時安全地更新數據。
如何在EF4(ORACLE)處理併發

void DescreaseInventory(int id, int qty){ 
    var order = (from o in context.Orders where o.ID ==id select o).FirstOrDefault; 
    if(order != null){ 
    if(((Order)order).Qty < qty) 
     throw new ApplicationException("Not Enough Inventory!!"); 
    else 
     ((Order)order).Qty -= qty; 
    } 
    else{ 
    //...some code... 
    } 
    //will content.savechange 
} 

此代碼將是危險的(逃避檢查數量)一旦競爭條件發生。誰知道如何正確地做到這一點?

編輯:現在我知道EF4提供一種機制,使一列作爲跟蹤令牌。但我不知道如何在oracle數據庫(9i)中創建這種列?什麼是適當的列類型?

回答

1

通過使用樂觀併發=要麼rowversion或時間戳列在數據庫中。這些列由數據庫維護,並在記錄更新時自動更改它們的值。如果您正確配置EF模型以使用此列進行併發檢查,您將避免一些問題。

當一個過程需要您的訂單將加載其當前的時間戳,當它試圖保存記錄的時間戳將是更新的WHERE條件的一部分。如果訂單在另一個進程中同時發生更改,它將不會找到要更新的記錄並引發異常。你將不得不從數據庫中刷新數據的重新計算數量或把它用於解決用戶得到實際狀況和實際時間戳和例子來處理這些異常。

+0

感謝Ladislav.how約以下步驟:定義一個DB觸發,觸發wiil更新timestamp列,一旦任何變化的行中發生的。將實體類的相應字段的**併發模式**屬性設置爲**固定**。 – user622851

+0

如果您使用我提到的類型,則不需要觸發。數據庫將自動執行此操作。 –

+0

非常感謝,回覆一次嘗試過。 – user622851