Согласно документации Service Fabric автоматически управляет уровнями транзакций и ищет вас (это в основном означает, что вы не можете изменить их).
Транзакции имеют двауровни изоляции:
- Повторяемое чтение : указывает, что операторы не могут читать данные, которые были изменены, но еще не зафиксированы другими транзакциями, и что никакие другие транзакции не могут изменять данные, которыебыла прочитана текущей транзакцией, пока текущая транзакция не завершится.
- Снимок : указывает, что данные, считанные любым оператором в транзакции, являются транзакционно-согласованной версией данных, существовавших в начале.сделки.Транзакция может распознавать только те изменения данных, которые были зафиксированы до начала транзакции.Изменения данных, сделанные другими транзакциями после начала текущей транзакции, не видны операторам, выполняющимся в текущей транзакции.В результате операторы в транзакции получают моментальный снимок зафиксированных данных в том виде, в котором они существовали в начале транзакции.Снимки одинаковы для всех надежных коллекций.
В документации указано, что все SER (чтение одного объекта) на основной реплике всегда повторяемое чтение уровень изоляции (TryGetValueAsync
- этоSER), поэтому нет способа изменить это для первичной реплики.В то же время для вторичной реплики все виды чтения всегда имеют Снимок уровень изоляции.
Таким образом, решение, которое я могу предложить, - это прочитать данные из вторичные реплики.Вот как можно получить адрес вторичной реплики, используя ServicePartitionResolver
class:
var partition = await ServicePartitionResolver.GetDefault().ResolveAsync(
tuple.serviceName,
new ServicePartitionKey(tuple.partitionName),
cancellationToken);
var address = partition.Endpoints
.Single(e => e.Role == ServiceEndpointRole.StatefulSecondary)?.Address;
Недостатком этого подхода является то, что вторичные данные реплики могут быть немногоустарел из-за задержки репликации.