Service Fabric 锁定和超时
Service Fabric locking and timeout
我正在处理多个线程正在访问此方法的情况
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 的单独事务来执行此操作。任何帮助,将不胜感激。
读取时的默认锁是共享锁。 (由 GetAsync
引起)
如果你想写,你需要一个独占锁。如果存在共享锁,则无法获取它。
获取第一个锁作为更新锁可以防止这种情况,就像您注意到的那样。
枚举记录时会发生快照隔离,而您在 GetAsync
中没有这样做。
更多信息here。
我正在处理多个线程正在访问此方法的情况
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 的单独事务来执行此操作。任何帮助,将不胜感激。
读取时的默认锁是共享锁。 (由 GetAsync
引起)
如果你想写,你需要一个独占锁。如果存在共享锁,则无法获取它。
获取第一个锁作为更新锁可以防止这种情况,就像您注意到的那样。
枚举记录时会发生快照隔离,而您在 GetAsync
中没有这样做。
更多信息here。