Нужно ли учитывать Etag в хранилище таблиц Azure при выполнении элемента обновления? - PullRequest
0 голосов
/ 20 ноября 2018

Я не знаю, нужно ли учитывать ETag для предотвращения одновременной работы нескольких потоков одним объектом.Ниже приведена моя текущая реализация:

    public void UpdateElement(T element)
    {
        Exceptions.ThrowIfNull(element, "record");
        var partitionKey = element.PartitionKey;
        var rowKey = element.RowKey;
        var result = Table.Execute(TableOperation.Retrieve<T>(partitionKey, rowKey));
        if (result?.Result != null)
        {
            Table.Execute(TableOperation.Replace(element));
        }
    }

Итак, я пытаюсь добиться того, чтобы поток A и поток B одновременно работали с одним и тем же объектом, а поток A сначала обновил этот объект.Когда поток B пытается обновить его, мы должны дать потоку B сообщение об ошибке «Вы не можете выполнить действие обновления».

1 Ответ

0 голосов
/ 28 ноября 2018

Одним словом, ETag не предназначен для ручной настройки.Фактически, он разработан для сценария Чтение-Редактирование-Запись и предотвращает Грязную запись из-за одновременных операций.

  • Если переменная element выбрана иззапрос к серверу, он уже содержит ETag, поступающий со стороны сервера, вам не нужно извлекать его снова, как var result = Table.Execute(TableOperation.Retrieve<T>(partitionKey, rowKey))
  • Если переменная element построена со стороны клиента, получая ETagсо стороны сервера и установить значение element не имеет особого смысла.

Пожалуйста, проверьте часть "Управление параллелизмом в службе таблиц" в https://azure.microsoft.com/en-us/blog/managing-concurrency-in-microsoft-azure-storage-2/ для получения более подробной информации.

...