0

我處理多個線程正在訪問該方法的情況服務織物鎖定和超時

using (var tx = StateManager.CreateTransaction()) 
{ 
    var item = await reliableDictioanary.GetAsync(tx, key); 
    ... // Do work on a copy of item 
    await reliableDictioanary.SetAsync(tx, key, item); 
    await tx.CommitAsync(); 
} 

單線程這個效果很好,但是當我嘗試使用多個線程訪問字典這樣,我遇到一個System.TimeOutException

我一直能解決的唯一方法是在GetAsync(...)方法上使用LockMode.Update。有沒有人經歷過這樣的事情?

我想知道是否有一種方法來讀取快照隔離,這將允許讀取時不鎖定它,而不是使用記錄上的共享鎖讀取。

我已經嘗試過,如上所示的共享事務以及get和set的單個事務。任何幫助,將不勝感激。

回答

1

讀取時的默認鎖定是共享鎖定。 (由GetAsync引起) 如果你想寫,你需要一個獨佔鎖。如果存在共享鎖,則無法獲取它。

獲取第一個鎖作爲更新鎖可以防止這種情況,就像您注意到的那樣。

枚舉記錄時會發生快照隔離,這是因爲您沒有使用GetAsync進行記錄。

更多信息here