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

       

HOLD (монопольный доступ к записи)



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


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

Оператор HOLD включает блокирование записи для следующих за ним операторов GET, NEXT или PREVIOUS в многопользовательской среде. Когда GET, NEXT или PREVIOUS успешно захватывают запись, они выставляют флажок "held" (заблокирована). Обычно это не дает остальным пользователям изменять эту запись, но не мешает читать ее. Конкретное действие HOLD зависит от файлового драйвера.

HOLD(файл) Запускает процесс блокировки так, что последующие GET, NEXT или PREVIOUS пытаются захватить запись до тех пор, пока это не удастся. Если запись уже захвачена другой рабочей станцией, то эти операторы будут ожидать освобождения этой записи.
HOLD(файл,секунды) Запускает процесс так, что последующие GET, NEXT или PREVIOUS вернут ошибку "Запись уже заблокирована", если за заданное число секунд они не смогут захватить ее.

В один момент времени только одна запись в каждом файле может быть заблокирована. Если происходит обращение к другой записи этого файла, то захваченная ранее запись автоматически освобождается.


Так же как и для LOCK, существует проблема "смертельного объятия". Оно возникает когда две рабочих станции пытаются захватить один и тот же нвбор записей, но в разной последовательности и обе они используют оператор HOLD(файл). Одна станция уже захватила запись, которую пытается захватить другая и наоборот. Этой проблемы можно избежать, используя оператор HOLD(файл,секунды) и отслеживая возникновение ошибки "Запись уже заблокирована".
Пример:
LOOP !Цикл во избежание "смертельного
! объятия"
HOLD(Master,1) !1 секунду пытаемся захватить запись глав-
! ного файла
GET(Master,1) !Читаем и блокируем запись
IF ERRORCODE() = 208 !Если кто-то уже захватил ее, то
BEEP(0,100); CYCLE ! подождем секунду и попробуем
! снова
.
HOLD(Detail,1) !1 секунду пытаемся захватить запись из
! файла подробностей
GET(Detail,1) !Читаем и блокируем запись
IF ERRORCODE() = 208 !Если кто-то уже захватил ее, то
RELEASE(Master) ! освободим захваченную ранее,
BEEP(0,100); CYCLE ! подождем секунду и попробуем
! снова
. . !Конец операторов IF и LOOP
См. также: , , ,



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