Multithreading 服务结构锁定和超时
我正在处理多个线程访问此方法的情况Multithreading 服务结构锁定和超时,multithreading,azure-service-fabric,service-fabric-stateful,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(); } 单线程这很
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
更多信息