Документация по Clarion


LOCK (монопольный доступ к файлу)



LOCK(файл[,секунды])


файл Метка файла, открытого для совместного доступа.
секунды Числовая константа или переменная, которая задает максимальное время ожидание в секундах.

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

LOCK(файл) Пытается заблокировать файл до тех пор, пока это не удастся. Если файл уже заблокирован другой станцией, то LOCK будет ждать, пока та станция не разблокирует файл.
LOCK(файл,секунды) Если за заданное время не удалось заблокировать файл, то возвращается ошибка "Файл уже заблокирован".

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


Возвращаемые ошибки:
32 Файл уже заблокирован
Пример:
LOOP !Цикл во избежание "смертельного
! объятия"
LOCK(Master,1) !1 секунду пытаемся заблокировать
! основной файл
IF ERRORCODE() = 201 !Если кто-то уже блокирует его, то
BEEP(0,100) ! ждем секунду и
CYCLE ! пытаемся снова...
.
LOCK(Detail,1) !За секунду пытаемся заблокировать
! файл подробностей
IF ERRORCODE() = 201 !Если кто-то уже блокирует его, то
UNLOCK(Master) ! разблокируем занятый нами файл,
BEEP(0,100) ! подождем секунду и
CYCLE ! еще разок попробуем
. . !Конец операторов IF и LOOP



Содержание раздела