Как защитить ресурс с помощью WCF PerCall Service - PullRequest
0 голосов
/ 14 марта 2011

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

например,

void CreateCustomer(Customer customer)
{
//If customer does not exists in DB
   //Create customer
}

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

Есть ли какой-то способрешить эту проблему, оставив при этом мой сервис на один звонок?

1 Ответ

3 голосов
/ 14 марта 2011

Вы путаете безопасность потоков с параллелизмом базы данных. Служба PerCall не создает проблем с безопасностью потоков, если только вы не порождаете несколько потоков в своей служебной программе (чего следует избегать).

Ваш вопрос должен быть перефразирован: вы обеспокоены согласованностью базы данных и параллелизмом в таблице Customer во время вставки (например, не видите клиента, которого создал кто-то другой).

Существует очень стандартизированный способ в реляционной базе данных, который выполняет свойства ACID (атомарность, согласованность, изоляция, долговечность), чтобы справиться с этим: Обернуть чек / вставку в транзакции.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...