2011-01-04 7 views
1

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

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

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

ответ

0

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

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

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

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

0

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

- Павел

0

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

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

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