Есть ли проблемы с параллелизмом в RIA? - PullRequest
0 голосов
/ 10 июня 2011

В одном из видео сервисов RIA о множественном освещении, о котором я говорил, у них был такой код обновления:

public void UpdateProspect(Prospect currentProspect)
{
    currentProspect.LastUpdate = DateTime.Now;
    ObjectContext.Prospects.AttachAsModified(currentProspect, ChangeSet.GetOriginal(currentProspect));
}

Мой первый вопрос: как это обновление вызовет проблемы? Чтобы показать проблемы, он запускает 2 клиента Silverlight, затем с 1-го клиента он обновляет элемент, и он приятно обновляется. Затем он идет ко второму клиенту и делает обновление, и он выдает ошибку. Почему РИА выбрасывает ошибки? Какое отношение это имеет к 1-му обновлению? Я думаю, это действительно глючит, и нам нужно снова написать специальный код для разрешения EntityConflict, а затем снова отправить пакет на сервер. Это уместно?

О, и я забыл, что он установил режим ConcurrencyMode на Fixed. Мой второй вопрос: когда бы вы установили ConcurrencyMode на Fixed? По умолчанию режим установлен на Нет.

Заранее спасибо:)

1 Ответ

2 голосов
/ 10 июня 2011

Это из-за состояния гонки, вызванного устаревшим чтением. Учтите следующее:

  1. Два клиента получают копию Prospect - назовем ее версией 1
  2. A изменяет свойство LastUpdate, объект теперь версии 2
  3. А сохраняет Prospect
  4. B изменяет свойство LastUpdate. Для Клиента B версия теперь версия 2 , но версия Клиента B 2 отличается от версии Клиента A
  5. B сохраняет Prospect - это перезапишет изменения Клиента A!

Проблема в том, что B не может знать, что A внес какие-либо изменения. Исключение выдается, чтобы предотвратить случайное удаление данных в состоянии гонки.

Решение состоит в том, чтобы перехватить это исключение и сообщить, что Prospect был изменен во время его редактирования, а затем перезагрузить его.

Более подробную информацию об использовании ConcurrencyMode=fixed вы можете найти здесь .

...