Вопрос

Я не являюсь отличным программистом VB, но мне поручено поддерживать/улучшать настольное приложение VB6, использующее Sybase ASE в качестве серверной части.У этого приложения около 500 пользователей.

Недавно я добавил в это приложение функциональность, которая выполняет дополнительную вставку/обновление одной строки в базе данных, где ключевым полем является номер транзакции, и это поле индексируется.Обновляемая таблица обычно содержит около 6000 записей, поскольку записи удаляются после завершения транзакций.После развертывания приложение работало нормально в течение полутора дней, прежде чем пользователи начали жаловаться на низкую производительность.

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

В имеющемся коде есть вызов для запуска транзакции Sybase.Внутри блока между BeginTrans и CommitTrans происходит вызов файла DLL, который обновляет базу данных.Я поместил свой новый код в модуль класса в DLL.

Я не понимаю, почему одна вставка/обновление одной строки может вызвать такую ​​проблему, тем более что до изменения система работала нормально.Возможно ли, что я выявил здесь более серьезную проблему?Или мне просто нужно пересмотреть свой подход?

Спасибо всем, кто был в подобной ситуации и может дать совет.

Это было полезно?

Решение

Оказывается, виновником было окно сообщения, которое появляется в области вызовов BeginTrans и CommitTrans.Пользователь с окном сообщения будет поддерживать блокировку базы данных до тех пор, пока не подтвердит сообщение.Решением было вывести окно сообщения за пределы вышеупомянутой области.

Другие советы

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

Кроме того, если это одна вставка ИЛИ обновление, почему вы используете транзакцию?Возможно ли, что многие пользователи попытаются обновить одну и ту же строку?

Было бы полезно, если бы вы опубликовали и код VB, и свой SQL (если возможно, с планом запроса).Однако с той информацией, которая у нас есть;я бы побежал update statistics table_name против таблицы, чтобы убедиться, что план запроса актуален.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top