Service Fabric锁定和超时

时间:2017-09-25 21:04:52

标签: multithreading azure-service-fabric service-fabric-stateful

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

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.Update方法上使用GetAsync(...)。这里有没有人经历过这样的事情?

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

我尝试过如上所示的共享事务以及get和set的单个事务。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

读取时的默认锁定是共享锁定。 (由GetAsync引起) 如果你想写,你需要一个独家锁。如果存在共享锁,则无法获取它。

将第一个锁定作为更新锁定会阻止此操作,就像您注意到的那样。

枚举记录时会发生快照隔离,而您不会使用GetAsync进行记录。

更多信息here