我在某些存儲庫模式中有以下pseduo代碼項目使用EF4。我該如何處理這個實體框架代碼中的這個樂觀併發錯誤?
public void Delete(int someId)
{
// 1. Load the entity for that Id. If there is none, then null.
// 2. If entity != null, then DeleteObject(..);
}
很簡單,但我得到一個運行時錯誤: -
ConcurrencyException: Store, Update, Insert or Delete statement affected an unexpected number of rows (0).
現在,這是發生了什麼: - EF4的
- 兩個實例在礦井運行應用程序在同一時間。
- 實例A調用delete。
- 實例B調用稍後刪除納秒。
- 實例A加載實體。
- 實例B還加載實體。
- 實例A現在刪除該實體 - 酷香蕉。
- 實例B嘗試刪除該實體,但它已經消失。因此,無計數或什麼不是0,當它預期1 ..或類似的東西。基本上,它發現它想要刪除的項目沒有刪除(因爲它發生在一秒鐘之前)。
我不確定這是否像競爭條件什麼的。
反正,有沒有什麼技巧我可以在這裏做,所以第二個電話不會崩潰?我可能使它成爲一個存儲過程..但我希望能夠避免現在。
任何想法?我想知道是否有可能在選擇被調用時鎖定該行(以及僅該行)...迫使實例B等待行鎖定已被關閉。到那個時候,該行被刪除,所以當實例B選擇時,數據不在那裏..所以它永遠不會刪除。
你爲什麼不處理併發異常?如果該對象已從另一個線程(又名EF實例)中刪除,則該線程沒有工作,因爲該記錄已被刪除。 – 2010-03-31 14:01:35
這就是問題 - >兩個實例都認爲它們有一個要刪除的對象,因爲它們都從數據庫中同時讀取。只是實例A實際上在第二次調用之前的納秒內完成DeleteObject(..)方法..對於同一個對象。現在,我的處理異常..但我覺得這是避免真正的問題..我想知道是否可以做一些鎖定或什麼處理? – 2010-03-31 20:31:29