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