Выбор СУБД для работы
![Сообщение Сообщение](./styles/prosilver/imageset/icon_post_target.gif)
Добавлено:
16 фев 2015, 08:13
Denis
Добрый день.
Передо мной стал вопрос выбора СУБД, которая бы позволила нормально работать.
Я долго боролся с MsSQL, ничего у меня с ней не получается сделать. Как только скрипт автообзвона открывает базу, это намертво ее блокирует.
А мне необходимо в течении дня выкидывать людей из обзвона - мой программа пытается обновить запись, в свою очередь всё блокирует и весь MsSQL повисает.
Вы можете какую-нибудь работающую СУБД посоветовать, Firebird, может быть?
Re: Выбор СУБД для работы
![Сообщение Сообщение](./styles/prosilver/imageset/icon_post_target.gif)
Добавлено:
16 фев 2015, 11:35
Jugin
Здравствуйте,
Думаю, в вашем случае дело не в базе данных (MSSQL прекрасно подходит для задач обзвона), а в неверной организации работы с данными.
Что бы было понятно, немного теории...
Один из основных принципов реляционных баз данных заключается в непротиворечивости выборки данных. Проще говоря, когда вы выполняете SQL-запрос к базе данных, сервер должен вам вернуть данные в том состоянии, в котором они находились на момент начала выполнения запроса. И как бы вы потом не меняли эти данные другим процессом, первоначальная выборка должна оставаться неизменной. Это не всегда так и не во всех источниках данных так, разные сервера выкручиваются по разному, что бы это обеспечить, но всегда нужно принимать это во внимание. Судя по всему у вас поэтому и происходит блокировка всей таблицы, если вы удаляете записи, которые уже попали в выборку на обзвон. Отсюда следует, что так делать не нужно, ошибка в принципе и не зависит от того, какой тип базы данных вы используете.
Таким образом если ваша задача заключается в том, что бы вы могли изменять выборку кандидатов на обзвон не останавливая сам процесс обзвона действовать нужно по другому, например:
1. Делаем выборку как обычно, но в таблице заводим дополнительное поле, признак того, что номер исключен. Перед обзвоном каждого номера проверяем этот признак, если он установлен, не звоним. Процесс, который обновляет данные, не удаляет записи, а устанавливает этот признак для тех, которые нужно исключить из обзвона. Здесь важно проверять этот признак не в основном SQL-запросе на выборку данных, а именно отдельным запросом перед прозвоном каждого номера. Только тогда можно будет получить правильное состояние этого признака именно перед прозвоном номера. Не могу гарантировать, что проблема с блокировкой исчезнет, но можно попробовать.
2. Переделываем SQL-запрос на выборку номеров для прозвона так, что бы он получал только один номер и устанавливаем количество циклов неограниченное (0). В этом случае программа получит один номер, обзвонит его, сохранит результат и повторит выборку. Каждый раз выборка будет актуальной и будет использовать только один номер. Блокировки в таком случае быть не должно. Нужно только проследить, что бы выборка не извлекала уже прозвоненный номер несколько раз.
Re: Выбор СУБД для работы
![Сообщение Сообщение](./styles/prosilver/imageset/icon_post_target.gif)
Добавлено:
17 фев 2015, 08:13
Denis
Добрый день.
Все-таки причина была в MsSQL и его неумении работать с версионностью. Перевел базу на FireBird и всё прекрасно работает. Спасибо за советы, жаль, что не помогли.
А пункт 1 я фактически реализовал - бесполезно. Как только объект Database открывает таблицу на запись, СУБД больше никому не дает в нее писать. Необходимо останавливать скрипт, закрывать подключение и только потом кто-то еще может таблицу обновлять. Такое видение многопользовательской работы у Микрософта.
Re: Выбор СУБД для работы
![Сообщение Сообщение](./styles/prosilver/imageset/icon_post_target.gif)
Добавлено:
17 фев 2015, 12:51
Jugin
Здравствуйте,
MSSQL неплохо работает в многопользовательском режиме. Возможно все же это особенности настройки вашей базы или драйвера ODBC.
Хорошо, что проблему удалось решить и спасибо что сообщили о ее решении.