MSA97: определение факта блокировки записей

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

MSA97: определение факта блокировки записей

Сообщение dormouse » 10.01.2007 (Ср) 22:25

конкретная проблема:
есть разделенная база. В одной части хранятся только общие справочные таблицы. В других базах-клиентах программная часть для разных целей. Все они используют примерно одни и те же таблицы из табличной части.
В таком виде всё это работало локально на одном компьютере. Всё работало без проблем
Затем табличная часть была помещена на файловый сервер в локальной сетке с витой парой. На сервере работает NetWare. Теперь к этой табличной части обращаются клиенты с нескольких компьютеров.
Таблицы в базе в разное время спонтанно требуется обновлять извне – из dbf-файлов. Делается это запросом на удаление всех записей из таблицы в базе, потом в неё копируется из файла (который связан с базой) запросом на добавление.

Когда табличная база располагалась локально на каждом компьютере, то процесс обновления проходил спокойно. При этом, если юзер забывал закрывать клиентские программы, которые используют обновляемую таблицу, то всё, что он видел на экране – в каждом поле каждой записи «Удалено!» :) В любом случае клиента приходилось перезапускать.
Теперь же, если в каком-то из клиентов курсор стоит на записи в этой таблице, то даже по статусбару процесса запроса на удаление видно, что происходит затык примерно в той позиции таблицы, где находится запись и клиент зависает :(

Вопрос: есть ли какой-то способ избежать этого зависания? Или ещё лучше способ, который позволит программно определить факт блокировки какой-то из записей таблицы, чтоб просто сообщить юзеру, что в данный момент обновление таблицы невозможно, т.к. она кем-то используется. А ещё лучше, чтоб сообщалось и имя этого клиента (как они перечисляются в ldb-файле, но только для всей базы :( )
о блокировках записей я знаю. но только то, что сам акцесс сообщает юзеру о невозможности редактирования записи. как это сообщение перехватить программно - не знаю. да и перехватить не успею. запрос зависнет раньше :(
VBA, MSA97

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2007 (Чт) 10:15

Серверный курсор, пессиместическая блокировка, маленький таймаут (задается в ConnectionString) и отлов ошибок.
Еще можно на клиентский модуль переписать, чтобы блокировки не происходило.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 11.01.2007 (Чт) 12:35

блокировку конкретной записи - никак.
надо пересмотреть алгоритм работы видимо, так как сетевая версия сильно отличается от настольной :wink:

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Сообщение dormouse » 10.08.2007 (Пт) 17:26

спустя несчётное количество дней, нашлось решение моей проблемы :) На всякий случай напишу о нём:

я всегда использую DoCmd.RunSQL "скуль-выражение"

а тут случайно наткнулся на другой способ выполнения запрососв на обновление:
CurrentDB.Execute "скуль-выражение", параметр
так вот можно выбрать режим блокировки записей и реакцию на неё. Тогда можно в процедуре VBA обрабатывать ошибки SQL. например ошибка, говорящая о том, что обновляемая запись заблокирована неким пользователем. Единственный недостаток - в процессе выполнения запроса в статусбаре не отображается шкала. Но в моём случае достаточно только запрос на очистку таблицы выполнить так, а копирование через DoCmd


воооот. желаю удачь тем, кто будет искать решение такой же проблемы ;)
VBA, MSA97

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.08.2007 (Пн) 7:51

Этим кодом ты используешь DAO.
Возможно лучше будет использовать CurrentProject.AccessConnection.Execute.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 228

    TopList  
cron