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