Хранимая процедура, слишком быстро возвращающая управление - VB6 - PullRequest
1 голос
/ 26 января 2012

У меня есть хранимая процедура, которая обновляет очень большую таблицу (с более чем 100 миллионами записей). Хранимая процедура обновляет записи в этой таблице.

Шаги следующие:

  1. Хранить идентификаторы записей для обновления в наборе записей (не все записи будут обновлены - только около 20000)
  2. Перебрать набор записей и вызвать хранимую процедуру для каждого идентификатора записи в наборе записей
  3. Каждый раз, когда хранимая процедура завершается (для каждой записи в наборе записей, упомянутых в части 1), обновляйте флаг в таблице, чтобы сообщить, что обновление завершено.

Я нахожу странное поведение. Похоже, что хранимая процедура передает управление обратно в VB6, прежде чем она закончит свои обновления и продолжает обработку следующей записи. Хранимая процедура затем отключается (для другого идентификатора записи). Поэтому существуют флаги, которые говорят, что обновлено (шаг 3), даже если хранимая процедура не была запущена (потому что она истекла по времени). Является ли это нормальным поведением, т. Е. Для хранимой процедуры передавать управление обратно в VB6 до того, как оно завершит работу?

Я прогуглил это и обнаружил, что это может быть из-за того, как хранимая процедура оптимизирована SQL Server. Я ожидаю, что управление будет передано обратно на VB6 только после завершения обновлений. Разве это не так?

Пожалуйста, обратите внимание, что я понимаю, что могут быть лучшие способы приблизиться к этому. Мой вопрос, в частности, относится к передаче SQL Server управления VB6 до того, как он завершит работу (обновление).

Ответы [ 2 ]

1 голос
/ 30 января 2012

Следующая статья оказалась решением этой проблемы: http://weblogs.sqlteam.com/dang/archive/2007/10/20/Use-Caution-with-Explicit-Transactions-in-Stored-Procedures.aspx. Похоже, что происходит следующее:

1) Запись 1. Запустите хранимую процедуру и создайте транзакцию. Тайм-аут при возникновении объекта команды SQL. 2) Запись 2. Запустите хранимую процедуру успешно. Верните constrol в VB6, чтобы обновить флаг в базе данных. 3) Запись 3. Запустите хранимую процедуру успешно. Верните constrol в VB6, чтобы обновить флаг в базе данных. 4) Запись 4. Запустите хранимую процедуру успешно. Верните constrol в VB6, чтобы обновить флаг в базе данных. 5) Программа заканчивается. Хранимая процедура откатывает транзакцию (транзакция теперь включает записи 1-4). Поэтому записи 1-4 не удаляются.

0 голосов
/ 29 января 2012

Можете ли вы ...

  • запустить код в sql management studio и посмотреть, что произойдет, и отчитаться?в таком случае я обновлю этот ответ, так как он поможет нам понять, что это за код / ​​соединение или sql.

другие вопросы для расследования, учитывая, что мы не знаем, какие случаи вы проверяли ...

  • использовать тот же путь кода в приложении ur vb и изменить только sql в хранимой процедуре на что-то очень простое, но с той же сигнатурой, что и при выполнении (т. Е. Чтение / basica при чтении, базовое удаление, если есть удаление, и то же самое для обновления и добавления), чтобы увидеть, что происходит.

Кроме того, некоторые другие мысли ...

  • , если вы используетеMSSQL, это так же просто, как если бы кто-то оставил окно запроса открытым, и он связывает базу данных.Это легко проверить.У меня была такая же проблема раньше.Я запускал хранимые процедуры до того, как у них не было тайм-аута, которые обычно запускались бы немедленно, но сидели бы на ночь и не запускались.Только чтобы понять, что другой человек оставил окно запроса открытым.Закройте их окно и пуф, наконец, запускается.Проверьте это, это может быть блокировка стола.Будь то приложение, делающее это, или это делает другой пользователь, делающий запросы к БД.Убедитесь, что ваше приложение закрывает соединения с БД при каждом их использовании.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...