2009-03-15 1 views
1

Я не большой программист VB, но мне поручено поддерживать/улучшать настольное приложение VB6, которое использует Sybase ASE в качестве внутреннего. В этом приложении около 500 пользователей.Как разрешить блокировки таблицы Sybase (VB6)?

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

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

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

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

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

+0

Это затормозит? Или другой код просто должен долго ждать, чтобы блокировка была выпущена? –

ответ

1

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

+0

Необходимо определить, что приложение НИКОГДА не должно допускать какого-либо взаимодействия с пользователем во время транзакции. Тот, кто закодировал этот блок сообщений, нарушил основные правила транзакции. Это не пользователь, а разработчик, который написал пользовательское взаимодействие, которому нужно получить образование. – PerformanceDBA

0

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^