Существует множество способов приблизиться к № 1. Если предположить, что ваши требования верны (я бы хотя бы дважды проверил их, потому что они звучат странно), то, вероятно, я бы сделал, чтобы создать таблицу ApplicationLock, которая выглядит примерно так:
CREATE TABLE ApplicationLock (SessionId UniqueIdentifier, CreateDate DateTime, LockType int, активный бит)
Затем, прежде чем вы захотите сделать что-то, что требует блокировки, проверьте, есть ли активная блокировка такого рода, которая помешает вам делать то, что вы хотите. (И если есть, посмотрите, прошел ли он определенный период времени ожидания. Если он был больше, чем какой-то период времени ожидания, вы сможете снять блокировку.) Если нет блокировки, которая блокировала бы вас, вставьте вашу собственную блокировку (вы можете создать SessionId на клиенте Silverlight с помощью Guid.NewGuid ()), сделать то, что вам нужно, и затем снять блокировку. Если все это может произойти в одном вызове метода веб-службы, вы должны обязательно обернуть его в транзакции, чтобы он автоматически откатывал блокировку в случае сбоя.
Ключ гарантирует, что ваши замки будут очищены. Если блокировка требуется только для одного вызова метода WCF, вы должны быть в состоянии обработать ее в коде на стороне сервера довольно легко. Однако, если они должны сохраняться при вызове методов, я думаю, вам понадобится стратегия, состоящая из нескольких частей. Если вы используете привязки с установлением соединения в своей службе WCF (например, Net.TCP), вы можете обработать событие отключения клиента, что позволит вам автоматически очистить любые блокировки, которые они открыли. Тем не менее, я бы не зависел от этого, и у меня был бы некоторый тайм-аут в качестве запасного варианта.
Для # 2 (предотвращение конфликтов, когда несколько человек редактируют таблицу), это зависит от того, какие конфликты будут проблематичными на бизнес-уровне. Если вы просто беспокоитесь о вставке двух строк, имеющих один и тот же первичный ключ, есть простые способы обойти это. Предполагая, что у вас есть суррогатный ключ в качестве вашего PK, вы должны сделать этот суррогатный ключ либо UniqueIdentifier (например, GUID, который позволяет вам безопасно создать ключ на клиенте), либо вы можете сделать его int / идентификатор столбца , а затем получить значение из таблицы, используя SCOPE_IDENTITY (). Я предпочитаю GUID, но любой из них будет работать.
Если вам нужно запретить пользователям редактировать значения, которые могли измениться под ними, то вы попадаете в оптимистическую или пессимистическую блокировки. Это довольно сложная тема, но вы можете начать здесь .
В примечании я упомянул, что требования звучат странно. Вы должны хотя бы взглянуть на различные уровни изоляции транзакций SQL и посмотреть, даст ли установка любого из них то, что вам нужно.