Как устранить блокировки таблицы Sybase (VB6)? - PullRequest
1 голос
/ 16 марта 2009

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 19 марта 2009

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

0 голосов
/ 16 марта 2009

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

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

0 голосов
/ 16 марта 2009

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

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

...