2015-10-21 2 views
1

Я получаю случайное исключение, когда пытаюсь обновить объект на таблице хранения. Исключение я получаюТаблицы хранения Azure - Состояние обновления Не удовлетворено

System.Data.Services.Client.DataServiceRequestException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: {"odata.error":{"code":"UpdateConditionNotSatisfied","message":{"lang":"en-US","value":"The update condition specified in the request was not satisfied.\nRequestId:2a205f10-0002-013b-028d-0bbec8000000\nTime:2015-10-20T23:17:16.5436755Z"}}} --- 

Я знаю, что это может быть проблемой параллелизма, но дело в том, что нет никакого другого процесса доступа к этому объекту.

Время от времени я получаю десятки этих исключений, я перезапускаю сервер, и он снова начинает работать нормально.

public static class StorageHelper 
    { 
     static TableServiceContext tableContext; 

     static CloudStorageAccount storageAccount; 

     static CloudTableClient CloudClient; 



     static StorageHelper() 
     { 

       storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
       CloudClient = storageAccount.CreateCloudTableClient(); 
       tableContext = CloudClient.GetTableServiceContext(); 
       tableContext.IgnoreResourceNotFoundException = true; 
      } 



public static void Save(int myId,string newProperty,string myPartitionKey,string myRowKey){ 
    var entity = (from j in tableContext.CreateQuery<MyEntity>("MyTable") 
          where j.PartitionKey == myId 
          select j).FirstOrDefault(); 


      if (entity != null) 
      { 
       entity.MyProperty= myProperty; 
       tableContext.UpdateObject(entity); 
       tableContext.SaveChanges(); 


      } 
      else 
      { 
       entity = new MyEntity(); 
       entity.PartitionKey =MyPartitionKey; 
       entity.RowKey =MyRowKey; 
       entity.MyProperty= myProperty; 
       tableContext.AddObject("MyTable", entity); 
       tableContext.SaveChanges(); 
      } 
} 
+0

Что такое tableContext? Этот фрагмент кода фактически не показывает никаких запросов в библиотеку хранилища. –

+0

Хорошо, я обновил код всем классом. –

ответ

0
  1. код Вы разместили использует очень старый настольный слой, который является устаревшим. Мы настоятельно рекомендуем рекомендовать вам обновление до более новой версии библиотеки хранилища и использование нового слоя таблицы. См. Это StackOverflow question для получения дополнительной информации. Также обратите внимание, что если вы используете очень старую версию библиотеки хранилища, они в конечном итоге перестанут работать, поскольку используемая ими версия сервиса будет устаревшей стороной обслуживания.

  2. Мы не рекомендуем клиентам повторно использовать объекты TableServiceContext, как это было сделано здесь. Они содержат множество отслеживаний, которые могут вызывать проблемы с производительностью, а также другие неблагоприятные последствия. Эти ограничения являются частью той причины, по которой мы рекомендуем (как описано выше) перейти на новый слой таблицы. См. how-to для получения дополнительной информации.

  3. На объекте таблицы update operations вы должны отправить заголовок if-match с указанием этага. Библиотека установит это для вас, если вы установите значение etag объекта. Чтобы обновить какой бы то ни было элемент организации в службе, используйте «*».

+0

Спасибо Эмили, я проверю все, что вы скажете, и попробуйте обновить как можно скорее (это не так уж и так, я написал этот код 2 года назад, и это был способ сделать это :) –

0

Я предлагаю вам рассмотреть возможность использования в Transient Fault Handling Application Block из Enterprise Library Microsoft, чтобы повторить попытку, когда ваши встречи приложений, такие переходные сбои в Azure, чтобы свести к минимуму перезагрузки сервера каждый раз, когда происходит то же исключение.

https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx

0

При обновлении вашей сущности, установите ETag = "*". Ваш измененный код должен выглядеть примерно так -

if (entity != null) 
{ 
    entity.MyProperty= "newProperty"; 
    tableContext.UpdateObject(entity); 
    tableContext.SaveChanges(); 
} 
+0

Mayur, я ничего не вижу в коде, который вы поделили. Вам что-то не хватает? –

Смежные вопросы