使用TryGetValueAsync从可靠字典中获取项目,或者具有我认为是共享锁的默认锁,或者具有将阻止其他事务中的写入的写锁,是否有办法从没有锁的可靠字典中获取项目?
答案 0 :(得分:1)
根据documentation Service Fabric自动管理交易级别并寻找您(这基本上意味着您无法更改它们)。
交易具有两个隔离级别:
- 可重复读取:指定语句无法读取已被其他事务修改但尚未提交的数据,并且没有其他事务可以修改当前事务读取的数据,直到当前事务为止完成。
- 快照:指定事务中任何语句读取的数据是事务开始时存在的数据的事务一致版本。事务只能识别在事务开始之前提交的数据修改。在当前事务开始之后,其他事务进行的数据修改对当前事务中执行的语句不可见。效果就像是事务中的语句获取已提交数据的快照一样,该快照在事务开始时就已存在。快照在可靠集合中保持一致。
文档指出,主副本上的所有SER(单实体读取)始终为 Repeatable Read 隔离级别(TryGetValueAsync
是SER操作),因此无法为主要副本更改此设置。同时,对于次要副本,所有类型的读取始终具有快照隔离级别。
因此,我建议的解决方案是从次要副本中读取数据。这就是使用ServicePartitionResolver
类获取辅助副本的地址的方式:
var partition = await ServicePartitionResolver.GetDefault().ResolveAsync(
tuple.serviceName,
new ServicePartitionKey(tuple.partitionName),
cancellationToken);
var address = partition.Endpoints
.Single(e => e.Role == ServiceEndpointRole.StatefulSecondary)?.Address;
此方法的缺点是,由于复制延迟,辅助副本数据可能会过时。