Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Одновременный доступ к файлу БД


Автор: GoBeer 6.12.2003, 11:49
Есть файл .DBF на сетевом ресурсе (NetWare). Мне нужно его программно скопировать в другое место. С этим файлом постоянно работает куча операторов (read/write), файл достаточно велик и его копирование занимает некоторое время. Нужно ли принимать какие-либо меры при открытии файла для запрета доступа к нему другими пользователями?

Автор: podval 6.12.2003, 18:13
Перенесено из "Алгоритмов".

Автор: AntonSaburov 8.12.2003, 10:41
Цитата
Нужно ли принимать какие-либо меры при открытии файла для запрета доступа к нему другими пользователями?


Обязательно. Иначе фигня получается. DBF не многопользователский вариант и надо самому принимать меры. И если работает много человек одновременно, то очень сложно - надо отрубать пользователей, потом делать эксклюзивный доступ к файлу, потом копировать, потом опять разрешать пользователям работу с базой - вообщем очень много проблем.

Поэтому совет на будущее - начинать сразу делать под SQL. Сейчас очень много Personal SQL-серверов - т.е. сервера работают локально на машине пользователя. Потом это перетащить на многопользовательский режим никаких трудов не представляет. И бэкап делать не проблема.

Автор: VisualCraft 8.12.2003, 13:58
AntonSaburov

"Сейчас очень много Personal SQL-серверов "

Но какие они тяжелые...

Посмотрите объем занимаемой памяти в менеджере процессов.
Как думаете для P1 75-100Mhz RAM 16Мб такой вариант (Personal SQL-сервер) сгодится?

А если не через специальный Engine (типа IB Express) работать, то еще нужно будет драйвер ставить, например BDE, ODBC, OLE DB.

А в случае VFoxPro DBF можно обойтись только ODBC и/или OLE DB, сохранив SQL ориентированность программы.

Автор: AntonSaburov 8.12.2003, 17:55
Здесь топик для выяснения совершенно определенного вопроса - и именно на него желательно отвечать.

Автор: Guest 9.12.2003, 15:05
Цитата(AntonSaburov @ 8.12.2003, 10:41)
Цитата
Нужно ли принимать какие-либо меры при открытии файла для запрета доступа к нему другими пользователями?


Обязательно. Иначе фигня получается. DBF не многопользователский вариант и надо самому принимать меры. И если работает много человек одновременно, то очень сложно - надо отрубать пользователей, потом делать эксклюзивный доступ к файлу, потом копировать, потом опять разрешать пользователям работу с базой - вообщем очень много проблем.

Код для копирования файлов взял из дельфового хелпа:
Код

   try
     AssignFile(f, fFrom);
     AssignFile(fnew, fTo);
     Reset(f, 1);
     ReWrite(fnew, 1);
     repeat
       BlockRead(f, Buf, SizeOf(Buf), NumRead);
       BlockWrite(fnew, Buf, NumRead, NumWritten);
       TotalNumWritten := TotalNumWritten + NumWritten;
       Proc := Round((TotalNumWritten/TotalNum)*100);
       tt := 'Êîïèðîâàíèå ôàéëîâ: ' + IntToStr(Proc) + '%';
       if (tt<>Status.Panels[1].Text) then begin
         Status.Panels[1].Text := tt;
         Status.RePaint;
       end;
     until (NumRead = 0) or (NumWritten <> NumRead);
   finally
     CloseFile(f);
     CloseFile(fnew);
   end;

Вопрос может ли файл измениться во время копирования? Неужели ОС (Novell 6.0) не предпринимает никаких мер по защите файла от одновременного доступа? Если нет, то можно ли это сделать программно?

Автор: AntonSaburov 9.12.2003, 15:35
Цитата
Вопрос может ли файл измениться во время копирования


В том то и дело, что прекрасно может. Обычно при открытии файла для редактирования он чаще всего делается доступным для чтения для других. Например - справочники. Один редактирует а другие в этот момент берут из них информацию.
И также можно делать бэкап. В таком случае можно скопировать файл в тот момент, когда кто-то из него удаляет или меняет записи. Может оказаться. что запись одной половиной будет новая, а другой - старая. Или скопировать, что одна запись удалена, а другая еще нет, хотя должно быть либо обе, либо ни одной. Т.е. целостность данных не гарантируется. А это при бэкапе самое важное.

Поэтому в принципе надо пытаться открыть файл в эксклюзивном режиме - только тебе smile.gif

Кроме того, обычно база данных не содержит один файл. Таких файлов много. И тут вообще полная задница - обеспечить "одновременный слепок" всех таблиц - архинеприятная задача. Надо фактически блокировать ВСЕ таблицы.
Представляете сложность ?

SQL-сервер ПОЛНОСТЬЮ устраняет такую проблему - у него есть свои механизмы для таких задач.

Вообщем, если надо сдлеать бэкап одной таблицы, надо открыть этот файл в монопольном режиме, отрубив всех или разрешив только чтение, скопировать а потом отпустить файл опять.
Такое открытие обеспечивается вызовами API самой ОС. Про Novell сказать ничего не могу - не знаю. Но уверен, что такое возможно.

Автор: GoBeer 9.12.2003, 16:03
Дело в том, что сама программа работает под управлением windows, а файл читает с подключенного сетевого ресурса, который лежит на новеловском сервере. И я вообще не представляю можно ли программно лочить файл на сетевом ресурсе, который к тому же новеловский.

Про SQL-серверы я знаю немало smile.gif Просто здесь такая ситуация сложилась.

Автор: Wladislav 13.12.2003, 14:30
у Foxа есть функции типа flock(), rlock(). Вначале закрываем файл на добавление новых записей, затем, постепенно, каждую запись...

Автор: IVM 29.12.2003, 17:49
Цитата(Wladislav @ 13.12.2003, 14:30)
у Foxа есть функции типа flock(), rlock(). Вначале закрываем файл на добавление новых записей, затем, постепенно, каждую запись...

Зачем закрывать записи после закрытия файла? Закрытия файла недостаточно?

Автор: Wladislav 31.12.2003, 19:28
Проверил - достаточно ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)