Вместо использования 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
Проблема в том, что вы не знаете, сколько времени ждать.Поскольку я не люблю повторять транзакцию снова и снова, я добавил терпимое ожидание, которого достаточно в большинстве случаев, а когда его нет, я возвращаю ошибку пользователю, чтобы повторить попытку.
Я бы хотелУ меня был способ получить доступ, чтобы закончить, освободить свои замки и некоторое время молчать.