Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизКеширование, зависание транзакции, что еще? Найти похожие ветки
← →
Rem © (2004-03-11 17:35) [0]В локальной сети несколько компьютеров. На всех - WinXP Pro. Одна из машин выступает в роли файл-сервера. На ней размещен файл базы данных в формате *.mdb. К этой базе данных подсоединяются пользователи. Программа (пользовательская) использует связку ADO (компоненты Delphi) + MSJet 4.0 + *.mdb. Периодически возникает ситуация, когда база данных блокируется (?), то-есть, выдается сообщение: "Невозможно внести изменения. Установлена блокировка." При этом вносить данные не могут пользователи на всех машинах. Но это еще полбеды.
На одной (единственной) машине программа продолжает работать, данные заносятся в базу, читаются, тут же отображаются, синхронизируются и пр. При этом в реальном файле БД изменений никаких нет. То-есть, с чем работает программа - непонятно. Хуже всего то, что при открытии с этого же (!) компьютера файла БД при помощи MS Access, он (Access) видит реальную БД (ту, что на сервере), без тех изменений, которые вносятся программой. При перезапуске программы (пользовательской), она видит реальную базу данных. При этом данные, внесенные в прошлой сессии, теряются. Но вносимые вновь (именно на этом компьютере) данные опять отображаются только в этой программе, а Access их в упор не видит!
Единственный (найденный) выход из ситуации - перезагрузка всех компьютеров. Не известно даже, кто блокирует базу данных, и какого рода эта блокировка.
На всех компьютерах возможность работы с автономными файлами отключена.
Вот и вопрос: Что такое видит программа (на этом одном компьютере), чего все остальные не видят? Куда она записывает данные? Откуда их читает? И... как всего этого избежать?
Есть предположение, что это просто не подтверждается транзакция. Правда, все транзакции оформлены:
ADOConnection.BeginTrans;
try
...
ADOConnection.CommitTrans;
except
ADOConnection.RollbackTrans;
end;
Кроме того, если это подвисшая транзакция, то она должна автоматически завершиться при выходе из программы, и БД должна разблокироваться. Но этого не происходит. Как уже было сказано, все приходит в норму только после полной перезагрузки всех компьютеров (возможно, только именно этого компьютера).
Все пользователи входят в систему с одним логином (может, поэтому и висит транзакция, запущенная от имени одного пользователя?).
К сожалению, более подробно описать симптомы не получится, так как было это всего 2 раза. Возможно, это особенность работы транзакций в ADO? Тогда почему MS Access нормально все видит?
И вообще: Кто управляет транзакциями в ADO: сам движок ADO? MSJet? А может, ADO использует DCOM для подключения к движку БД на удаленном компьютере(эдакая кооперация)?
← →
Rem © (2004-03-11 18:11) [1]Никаких соображений? Или влом читать длинный вопрос? :)
← →
sniknik © (2004-03-11 18:33) [2]попробуй переделать все
ADOConnection.BeginTrans;
на
ADOCommand.CommandText:= "BEGIN TRANSACTION";
ADOCommand.Execute;
остальное соответственно.
но вообще база access не сетевая а локальная со всеми отсюда вытекаюшими ...
желательно перейти, хотябы на MSDE/MSSQL (минимум переделок), MSDE есть на дисках с MS Office.
← →
Rem © (2004-03-11 20:03) [3]Не хочется возится с MS SQL. В недалеком будущем - переход на трехзвенку.
Хочется разобраться в причинах возникновения таких вот ситуаций.
Кстати: может, кто знает, как снять блокировку с БД в случае аварийного отключения от сервера (кабель на рабочей станции отошел)? При этом блокировка БД остается или нет? Можно поэкспериментировать, но как-то со временем туго, система работает почти круглосуточно. И вообще, как проверить факт реальной записи данных в файл БД (мимо дискового/сетевого кеша)?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c