1

我正在处理多个线程正在访问此方法的情况

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.

我能够解决它的唯一方法是使用LockMode.UpdateGetAsync(...)方法。这里有没有人经历过这样的事情?

我想知道是否有一种方法可以通过快照隔离进行读取,这将允许在没有锁定的情况下进行读取,而不是在记录上使用共享锁进行读取。

我已经尝试使用如上所示的共享事务以及 get 和 set 的单个事务来执行此操作。任何帮助,将不胜感激。

4

1 回答 1

3

读取时的默认锁是共享锁。(引起GetAsync)如果你想写,你需要一个排他锁。如果存在共享锁,您将无法获得它。

正如您所注意到的,将第一个锁作为更新锁可以防止这种情况发生。

枚举记录时会发生快照隔离,而您没有使用GetAsync.

更多信息在这里

于 2017-09-26T06:24:21.810 回答