msaccess odbc для блокировки sqlserver 2005: время ожидания - PullRequest
0 голосов
/ 06 июля 2011

У меня есть база данных msaccess, подключающаяся к серверу sql через связанные таблицы с помощью драйвера odbc "sql server".В основном это работает хорошо, за исключением случаев, когда речь идет о транзакциях.

Проблема, для которой я не могу найти обходного пути, заключается в "Lock: timeout", который возникает, когда форма msaccess решает обновить себя, пока большая транзакцияобрабатывается (10-30 секунд).

Если msaccess пытается попасть в строку, заблокированную транзакцией, SQL Server Profiler мгновенно отображает Lock: Timeout, но MSAccess не может это обработать, и блокирует приложение, пока не истечет время его собственного запроса (60 секунд).,Глупость в том, что она также приостанавливает VBA, поэтому транзакция не может быть завершена.

Помимо закрытия всех форм, открытых во время этих пакетов, что я могу сделать?

Если бы я могустановите тайм-аут блокировки mssql для соединений odbc, транзакция может иметь возможность завершиться, но для этого не существует параметра строки соединения.Это сложно, потому что фоновое поведение MSAccess в основном вне моего контроля.И я уверен, что для базы данных sql не может быть установлен глобальный тайм-аут блокировки.

Есть идеи?Спасибо Люк

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Я обнаружил, что лучшим способом было бы посылать вычисленные результаты vba в таблицу на стороне сервера, которая не привязана к какому-либо объекту интерфейса msaccess, а затем вызывать процесс "финализации", который использует эту таблицу для обновления других таблиц, которые могут быть связаны,

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

Хранение данных до и после в таблице на стороне сервера позволяет обнаруживать строки, которые могли быть изменены другими процессами во время вычисления vba.Это избавляет от необходимости блокировать что-либо на длительный период времени, что увеличит риск зависания msaccess, если он не сможет обработать блокировку сервера: тайм-аут.

Это зависание msaccess все еще может произойти, если обновление формы происходит во время транзакции финализационного процесса (подтверждено в версиях 2k3 и 2k7), но оно не может заблокировать завершение этого процесса, что в худшем случае приведет к минутной задержкеклиенту.

0 голосов
/ 07 июля 2011

Вместо использования msaccess currentproject.connection я запускаю новое соединение adodb непосредственно с сервером SQL, а затем устанавливаю тайм-аут блокировки.например, cnn.execute "set lock_timeout 1000".Тогда это соединение выдаст ошибку, когда истечет время ожидания блокировки - эту ошибку вы можете перехватить.Недостатком является то, что вы должны перевести jet sql в tsql.Положительным моментом является то, что вы можете поместить переведенный tsql в хранимую процедуру и запустить его быстрее.

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

В другом случае у меня был вычисляемый столбец, который вычислялся долго (3-5 секунд) после me.refresh.Я нуждался в этом me.refresh и искал лучшее решение, чем отключение элемента управления.Я обнаружил, что если повторять попытку транзакции после перехвата ошибки блокировки, она будет работать в течение 5 попыток, если между каждым оператором у меня были события.Затем я обнаружил, что эта задержка обычно позволяет msaccess завершать свою работу.

tt = Timer: Do While Timer - tt < 5: DoEvents: Loop

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

Я бы хотелУ меня был способ получить доступ, чтобы закончить, освободить свои замки и некоторое время молчать.

...