контроль параллелизма: синхронизация данных через веб-сервисы;Как? - PullRequest
1 голос
/ 04 января 2011

На самом деле я разработал сайт Asp.net, в котором есть часть приложения для КПК. Дело в том, что сотрудники компании приходят утром и получают данные на своих КПК, и они работают над ними целый день, а вечером они снова приходят в офис или с любого веб-доступа обновляют данные на сервере. Мы сделали это через веб-сервисы, потому что веб-сервисы являются удаленными методами, поэтому они могут получить к ним доступ только через веб-доступ.

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

В веб-сервисах мы получаем DataTable из приложения PDA и выполняем операции обновления или вставки через LINQ с Sql Server.

Ответы [ 3 ]

0 голосов
/ 04 января 2011

Посмотрите на класс Linq ChangeConflictException , который будет сгенерирован, когда два обновления произойдут с одними и теми же данными.Вы можете использовать это, чтобы вставить код разрешения конфликта.Например, если два продавца продают продукт одному и тому же клиенту, вы можете изменить идентификатор, а затем повторить попытку.Или изменения могут быть полностью допустимы для перезаписи, и в этом случае вы можете просто получить новое значение и затем зафиксировать.

Другой способ может заключаться в создании хранимых процедур, которые являются взаимоисключающими и / или гарантируют согласованность, когда онизапустить.Таким образом, вам не нужно использовать linq, вы можете выполнить некоторый анализ изменений и затем запустить соответствующий SPROC для БД, чтобы вставить заказ, или обновить сведения о клиенте.

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

0 голосов
/ 04 января 2011

Каковы варианты использования данных, которые клиенты забирают с собой? Они только обновляют данные или также вводят новые данные?

Для обновления только данных вам необходимо принять решение о том, является ли последнее значение для конкретной строки правильным (например, зафиксировать значение с последней отметкой времени) или есть ли значение в других данных.

При работе со вставкой данных я собираюсь предположить, что ваша база данных использует инкрементальный первичный ключ. В этом случае вы не сможете просто зафиксировать DataTable, полученный из приложения PDA. Вам нужно будет определить, какие новые строки, а затем вставить эти новые строки БЕЗ инкрементного идентификатора в таблицу сервера, чтобы сгенерировать новый инкрементный идентификатор. Затем вы должны обновить DataTable КПК новыми сгенерированными идентификаторами.

Чтобы иметь дело с фактическим порядком, в котором обрабатываются обновления (синхронизация нескольких клиентов одновременно), я бы предложил, чтобы процесс синхронизации помещал наборы данных в очередь так, чтобы обновления сервера последовательно управлялись, что делает процесс немного проще.

0 голосов
/ 04 января 2011

То, что вы могли бы сделать, - это создать FIFO-подобный канал, состоящий из запросов "commit". В этом случае вы можете выполнять модификации, поступающие только от одного клиента за раз (все остальные клиенты должны будут ждать). В то же время вам необходимо отслеживать строки, которые были обновлены (новые строки, вероятно, не имеют места). Если есть какие-либо конфликтующие изменения (пользователь пытается изменить строку, которая уже была изменена другим пользователем), тогда клиенты должны знать о них (или вы можете попытаться автоматически объединить эти изменения).

- Павел

...