Jugin » 16 фев 2015, 11:35
Здравствуйте,
Думаю, в вашем случае дело не в базе данных (MSSQL прекрасно подходит для задач обзвона), а в неверной организации работы с данными.
Что бы было понятно, немного теории...
Один из основных принципов реляционных баз данных заключается в непротиворечивости выборки данных. Проще говоря, когда вы выполняете SQL-запрос к базе данных, сервер должен вам вернуть данные в том состоянии, в котором они находились на момент начала выполнения запроса. И как бы вы потом не меняли эти данные другим процессом, первоначальная выборка должна оставаться неизменной. Это не всегда так и не во всех источниках данных так, разные сервера выкручиваются по разному, что бы это обеспечить, но всегда нужно принимать это во внимание. Судя по всему у вас поэтому и происходит блокировка всей таблицы, если вы удаляете записи, которые уже попали в выборку на обзвон. Отсюда следует, что так делать не нужно, ошибка в принципе и не зависит от того, какой тип базы данных вы используете.
Таким образом если ваша задача заключается в том, что бы вы могли изменять выборку кандидатов на обзвон не останавливая сам процесс обзвона действовать нужно по другому, например:
1. Делаем выборку как обычно, но в таблице заводим дополнительное поле, признак того, что номер исключен. Перед обзвоном каждого номера проверяем этот признак, если он установлен, не звоним. Процесс, который обновляет данные, не удаляет записи, а устанавливает этот признак для тех, которые нужно исключить из обзвона. Здесь важно проверять этот признак не в основном SQL-запросе на выборку данных, а именно отдельным запросом перед прозвоном каждого номера. Только тогда можно будет получить правильное состояние этого признака именно перед прозвоном номера. Не могу гарантировать, что проблема с блокировкой исчезнет, но можно попробовать.
2. Переделываем SQL-запрос на выборку номеров для прозвона так, что бы он получал только один номер и устанавливаем количество циклов неограниченное (0). В этом случае программа получит один номер, обзвонит его, сохранит результат и повторит выборку. Каждый раз выборка будет актуальной и будет использовать только один номер. Блокировки в таком случае быть не должно. Нужно только проследить, что бы выборка не извлекала уже прозвоненный номер несколько раз.