Страница 1 из 1

Добавлено: 21 Май 2004, 11:01
Гость
Hello, All!

Столкнулись со следующей проблемой.
Куча пользователей. Периодически запускается длительный расчет, который перелопачивает кучу записей (1600 карточек за 3 минуты - это что-то по зарплате, завтра Fant, наверное, уточнит). Для ускорения работы транзакция разбивается на несколько частей, между Commit и Logout программа делает небольшую паузу, чтобы кто-то еще смог вклиниться и что-то сделать.

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

Больше всего расстраивает то, что клиент пытается запустить расчет и после нескольких секунд ожидания получает сообщение, что программа не может получить доступ в файлам. Т.е. Logout(N, ...) не спасает даже, если время N больше, чем время обработки нескольких карточек, включенных в транзакционные скобки (чтоб-таки попасть на эту паузу между расчетами).
Попытка делать транзакцию лишь на расчет 1-й карточки дает тормоза при их большом количестве.

Вопрос, пожалуй к Олегу Руденко: не знаете ли вы, с какими интервалами драйвер пытается получить доступ к базам при начале транзакции?

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

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

На SQL пока не переходим по технически-идеологическим причинам :(

--
Best regards,
Maxim Yemelyanov,
Enigma Soft Company
phone: (057) 2177977,759072(3!4)
WEB: http://enigmasoft.com.ua
e-mail: maxim@enigmasoft.com.ua
ICQ: 12253836

(Добавление)

Я чего-то не понял. Если это тот-же расчет, то зачем его запускать повторно?
Подождать и посмотреть готовый результат. Если это другой расчет (по другим карточкам), то надо отсосать нужный для расчета набор в локальный файл или очередь и считать по нему. И еще, а зачем транзакция? Запретить на время расчета операции которые могут менять исходные данные, и все. Т.е. открыть эти файлы ReadOnly+DenyWrite.

WBR, Nick Tsigouro Mailto:N.Tsigouro@mtu-net.ru

Повторю вопрос... Не знаете ли Вы, с какими интервалами драйвер пытается получить доступ к базам при начале транзакции? По специфике именно моей задачи пишу в ClaTalk.

Best regards, Fant. mailto: fant@enigmasoft.com.ua
------------------- ICQ: 262998995

(Добавление)

Не знаю, и знать не особенно желаю. Нельзя завязавать решение задачи на такие _недоступные_для_контроля_и_управления_ подробности реализации. Это в корне неправильно. ИМХО.

WBR, Nick Tsigouro
Написал: ClaList(2)

Добавлено: 24 Май 2004, 10:39
Гость
Относительно к драйверу "TOPSPEED":
перед открытием самой транзакции драйвер пытается заблокировать каждый файл из списка Logout.
Т.е. сама задержка производится именно в операторе LOCK - один раз в секунду.
Кстати, может получится довольно интересная ситуация:
- первая станция: Logout(5,A,B,C)
- вторая станция: Logout(5,B,A,C)
- третья станция: Logout(,C)

Если начало запуска транзакции совпадет на всех станциях, то вполне может случится так, что через 5 секунд на обеих первых станциях получим "отлуп" началу транзакции, а вот третья станция в это время спокойно начнет свою транзакцию.
Прямо как в поговорке - "Пока двое деруться, третий пользуется"!

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru

Большое спасибо за ответ.
То что нужно. Еще раз спасибо.

Best regards, Fant

Написал: ClaList(2)