Могу ли я получить элемент без блокировки от пункта надежного слова в сервисной структуре - PullRequest
0 голосов
/ 11 декабря 2018

Использование TryGetValueAsync для получения элемента из надежного словаря имеет либо блокировку по умолчанию, которая, как я полагаю, является общей блокировкой, либо блокировку записи, которая блокирует запись в другой транзакции, есть ли способ получить элемент из надежного словаря без блокировки?

1 Ответ

0 голосов
/ 14 декабря 2018

Согласно документации 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;

Недостатком этого подхода является то, что вторичные данные реплики могут быть немногоустарел из-за задержки репликации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...