【问题标题】:Service Fabric locking and timeoutService Fabric 锁定和超时
【发布时间】:2018-03-06 22:51:40
【问题描述】:

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

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 的单个事务来执行此操作。任何帮助,将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    枚举记录时会发生快照隔离,而 GetAsync 不会这样做。

    更多信息here

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 2021-03-03
      • 2020-04-28
      • 2019-03-21
      • 2018-08-02
      • 1970-01-01
      • 2016-10-31
      • 2016-03-11
      • 2021-11-30
      相关资源
      最近更新 更多