:: Visual Foxpro, Foxpro for DOS
Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Она возникает при открытии таблицы. Ошибка не частая, за год максимум два раза была, но и это нехорошо...

Программа работает в сети, и 100% какой то пользователь блокирует заголовок этой таблицы, пересмотрел код на наличие Транзакций-ничего криминального не нашел.

В программе запись из этой таблицы редактируется напрямую, без буферизации, при открытии на редактирование происходит ее блокировка командой LOCK() и по идее все..

Ни буферизация. ни транзакций для этой записи нет (не нужно)

Пересмотреть весь код, включить логирование, нереально (так как ошибка не очень частая), посоветуете, какие команды могут блокировать таблицу, буду искать поиском, может что и накопаю...
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
medstrах

Сообщений: 1810
Дата регистрации: 10.06.2019
Я думал, что Дзэнтигра - это тетка
Жаль
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Это простой офисный работник, который временами балуется VFP (для облегчения работы), а еще очень любить мотоциклы и самолеты, но на второе не хватает денег

А ник из лохматых 2000, и здесь поменять его уже нельзя, думал еще и аватарку сменить, на красивую блондинку, но все руки не доходят...



Исправлено 1 раз(а). Последнее : ZenTigra, 21.06.19 10:03
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
medstrах

Сообщений: 1810
Дата регистрации: 10.06.2019
Ладно, не оправдывайся, просто вычеркиваем тебя из списка кандидатов на чорную софу
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> В программе запись из этой таблицы редактируется напрямую, без буферизации, при открытии на редактирование происходит ее блокировка командой LOCK() и по идее все..
UNLOCK после редактирования делается? Таблица открывается в каком режиме (SHARED, EXCLUSIVE, какие общие SET-настройки) ?
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Раньше аналогичные вопросы возникали пару раз за год.
Антивирус.
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
У меня тоже такое подозрение было, на жаль файла - отчета о предыдущей ошибке не сохранил, но кажись тогда была другая таблица...
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
of63
> В программе запись из этой таблицы редактируется напрямую, без буферизации, при открытии на редактирование происходит ее блокировка командой LOCK() и по идее все..
UNLOCK после редактирования делается? Таблица открывается в каком режиме (SHARED, EXCLUSIVE, какие общие SET-настройки) ?

Таблицы открываются SHARED
UNLOCK -делается при закрытии формы редактирования

Вот часть настроек
SET EXCLUSIVE OFF && Многопользовательский режим
SET MULTILOCKS ON && Разрешает блокировку групп записей
SET REPROCESS TO 3 && Задает количество попыток заблокировать запись (таблицу)
SET OPTIMIZE ON && Оптимизация
SET AUTOSAVE OFF && Отключении буфера

PS.В программу пытались зайти как минимум полторы минуты, через 10мин, когда я подошел уже все работало...



Исправлено 1 раз(а). Последнее : ZenTigra, 21.06.19 10:52
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
medstrах

Сообщений: 1810
Дата регистрации: 10.06.2019
А SET GOMOEXILE где?
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Порылся по архивам, и нашел такую же ошибку, но совсем в другого пользователя, и в другом месте программы и иной командой, но с той же таблицей.

INSERT INTO book2...
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вполне логично что если делается ручной LOCK, потом юзер ковыряется в носу рассматривая форму редактрирования, и через часок соизволит её закрыть - при чём и выполнится UNLOCK, конфликты связанные с блокировками просто таки неизбежны.
В нормальной многопользовательской системе НЕ используют ручных блокировок (есть редкие исключения, и они НЕ связаны с формами ввода данных) - блокироваться запись (или залоловок таблицы для операций вставки) должна на микросекунды - и только в момент когда идёт запись данных (а не ввод инфы в поля на форме). А конфликты у других пользователей разрешаются настройкой SET REPROCESS - т.е. повторными попытками выполнить операцию не удавшуюся из за блокировки.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Igor Korolyov
Вполне логично что если делается ручной LOCK, потом юзер ковыряется в носу рассматривая форму редактирования, и через часок соизволит её закрыть - при чём и выполнится UNLOCK, конфликты связанные с блокировками просто таки неизбежны.
В нормальной многопользовательской системе НЕ используют ручных блокировок (есть редкие исключения, и они НЕ связаны с формами ввода данных) - блокироваться запись (или залоловок таблицы для операций вставки) должна на микросекунды - и только в момент когда идёт запись данных (а не ввод инфы в поля на форме). А конфликты у других пользователей разрешаются настройкой SET REPROCESS - т.е. повторными попытками выполнить операцию не удавшуюся из за блокировки.

Ну наставьте меня на путь истинный.

Приведу упрощенную задачу (СИЛЬНО УПРОЩЕННУЮ!)

[attachment 31197 FoxPro4.png]

Есть 4 таблицы
table1 которая имеет связь с table1a
table2 которая имеет связь с table2a
в свою очередь таблица table2a связана с table1a

Поля key - это уникальные ключи
date - дата документа
text - описание
name - наименование товара
quantity - количество товара
price - цена товара
suma - сума за товар/сумма по всей накладной
balance - остаток товара (table1a.quantity-table2a.quantity), для быстрой выборки остатка товара

Так вот, пользователь открывает на редактирование таблицу table2 (или создает новую запись), по идее никто не должен в этот момент также открыть на редактирование эту накладную (просмотр доступен), КАК в этом случае запретить другим пользователям редактировать эту накладную, или докажите мне, что необходимо в такой ситуации РАЗРЕШАТЬ нескольким пользователям редактировать эту накладную.
Я не говорю про блокировку записей в таблице товаров table1a и table2a, она кратковременна и только в момент записи (+ есть проверка, на возможность изменения данных)
Естественно для блокировки записи в table2 я использую команду
LOCK( )
на все то время когда открыта накладная, в чем я не прав?

PS.Даже открыв несколько накладных (и блокируя записи), параллельно делая в них изменения, я не смог с генерировать ошибку 108.File is in use by another user. (Файл используется другим пользователем).

Я немножко не так спросил открывая этот пост, вопрос нужно было сформировать так:
Какие команды блокируют таблицу кроме BEGIN TRANSACTION и =CURSORSETPROP("Buffering",4.. (поиском в программе я постараюсь их найти, и решить целесообразность их использования)



Исправлено 1 раз(а). Последнее : ZenTigra, 25.06.19 10:34
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
of63

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А может забить на поиск строки программы, которая зазря блокирует или не разблокирует, а обернуть команду USE (или какая другая) в TRY..ENDTRY, и сделать повтор, через каждую секунду, раз 10, или 100, с вывеской сообщения, с возможностью отказаться от ожидания открытия, с записью датывремени в лог чтобы потом посмотреть...
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ZenTigra
Ну наставьте меня на путь истинный.
Думаю что это не имеет смысла. И так доживёте...
ZenTigra
КАК в этом случае запретить другим пользователям редактировать эту накладную
Зачем запрещать?
ZenTigra
или докажите мне, что необходимо в такой ситуации РАЗРЕШАТЬ нескольким пользователям редактировать эту накладную.
Не вижу смысла тратить время на объяснение банальных вещей. Запись это не туалет, чтобы пока кто-то один там сидит больше никто не мог войти
ZenTigra
Естественно для блокировки записи в table2 я использую команду
LOCK( )
на все то время когда открыта накладная, в чем я не прав?
В том что запись блокируется на всё время пока открыта накладная. А это время никак не ограничено - т.е. по сути она может быть заблокирована хоть на год.
Если ОЧЕНЬ надо по бизнес-требованиям ограничивать доступ к записям "уже открытым пользователем А", то это реализуют при помощи явных полей-флагов, в самом тупом случае просто логическое поле "занято", в более продвинутых способах - набором полей типа "юзер_заблокировавший_запись, дата_блокировки" можно ещё расширять их перчень. Т.е. открываем форму - прописываем в запись эти флаги - закрываем форму - очищаем флаги. Ну и плюс администратор/менеджер имеет возможность вручную "разблокировать" запись, если к примеру программа поломалась, или пользователь, подлец этакий, ушёл в отпуск не закрыв форму.
ZenTigra
PS.Даже открыв несколько накладных (и блокируя записи), параллельно делая в них изменения, я не смог с генерировать ошибку 108.File is in use by another user. (Файл используется другим пользователем).
108 ошибка возникает при блокировке всего файла целиком (а не отдельной записи), или же заголовка файла, при том что к примеру команда открытия USE (или любое неявное открытие таблицы) тоже блокирует заголовок, пытаясь проверить соответствие числа записей в dbf счётчику в его заголовке.
Самое простое - заблокировать ОДНУ (любую) запись в одной сессии (хоть явным lock, хоть неявно при пессимистической буферизации открыть в бровз-окне и изменить любое поле, не покидая потом изменённую запись) и попробовать в другой сессии исполнить REPLACE неважно_что FOR любое_условие_даже_то_под_которое_не_подходит_ни_одна_запись - получим именно 108 ошибку.
ZenTigra
Какие команды блокируют таблицу
Раздел хелпа Locking Data
Хотя там далеко не всё подробно описано, и надо вдумчиво читать связанные разделы...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Igor Korolyov
ZenTigra
Ну наставьте меня на путь истинный.
Думаю что это не имеет смысла. И так доживёте...

ZenTigra
Какие команды блокируют таблицу
Раздел хелпа Locking Data
Хотя там далеко не всё подробно описано, и надо вдумчиво читать связанные разделы...

А, говорили что и так доживу, а помогаете

Спасибо, всем за помощь.

Я нашел проблему, это команда FLOCK() (когда то написал, и забыл про это), теперь ломаю голову, как ее в этом месте не использовать.

Задача, необходимо заблокировать ВСЕМ пользователям возможность добавлять и редактировать записи в одной таблице,
Для этого я использовал команду FLOCK(), но я не подумал, про то, что при этом запрещается и открытие этой таблицы.



Исправлено 3 раз(а). Последнее : ZenTigra, 04.07.19 15:49
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Совершенно без понятия, как работают блокировки в фоксе.
MS SQL.
Надо не дать доступ к записи. (из программы, фактически ничего не блокируется.)
Есть список работающих юзеров.
Есть таблица, куда пишется кто, что и когда заблокировал.
В MS легко определяется, подсоединен ли еще этот юзер, если данный сеанс отвалился, значит запись свободна, иначе, выдаю сообщение, тому кто пытается ее открыть, "Занято тем то, тогда то".

Вкратце так.
Кажется проще, в таблице прописывать в спец поле, кто и когда занял, но тут проблема с отвалившимися... Как их убивать?
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Доморощенный set_applock, про который знает только твое приложение.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Rifat

Сообщений: 32
Дата регистрации: 06.02.2012
Извечная проблема многопользовательского доступа к таблицам в БД вполне успешно решается в фоксе буферизацией и транзакциями. В очень длительном проекте решения клиент-серверного приложения никогда не использовал всякие LOCK, всегда работает правило - кто последний, тот и прав.
Ratings: 0 negative/1 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ZenTigra
Задача, необходимо заблокировать ВСЕМ пользователям возможность добавлять и редактировать записи в одной таблице,
Назачем? Тупое требование...

ZenTigra
Для этого я использовал команду FLOCK(), но я не подумал, про то, что при этом запрещается и открытие этой таблицы.
Не запрещается. Читать про SET TABLEVALIDATE.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Никак не могу отловить ошибку 108.File is in use by another user. (Файл используется другим пользователем)
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Igor Korolyov
ZenTigra
Задача, необходимо заблокировать ВСЕМ пользователям возможность добавлять и редактировать записи в одной таблице,
Назачем? Тупое требование...
В конце смены, происходит закрытие дня, и ни какие уговоры, чтоб не пытались добавлять/редактировать записи в этот момент, не действуют.
А так радикально, заблокировать всем...


Igor Korolyov
ZenTigra
Для этого я использовал команду FLOCK(), но я не подумал, про то, что при этом запрещается и открытие этой таблицы.
Не запрещается. Читать про SET TABLEVALIDATE.

Если ты была девочка, я б тебя расцеловал
А так, только большое спасибо!

PS.Думаю SET TABLEVALIDATE TO 4 - спасет меня
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 33 (Гостей: 33)

© 2000-2024 Fox Club 
Яндекс.Метрика