Пытается блокировать одну или несколько записей в таблице.
Синтаксис:
LOCK([nWorkArea | cTableAlias] | [cRecordNumberList, nWorkArea | cTableAlias])
Параметры:
nWorkArea | cTableAlias
Пытается блокировать текущую запись в таблице, открытой в данной рабочей области. nWorkArea задает номер рабочей области, а cTableAlias ѕ псевдоним таблицы. Если рабочая область и псевдоним не заданы, функция LOCK( ) пытается блокировать текущую запись таблицы, находящейся в текущей рабочей области.
cRecordNumberList
Задает список номеров записей, если вы хотите блокировать группу записей. При этом установка SET MULTILOCKS должна иметь значение ON и необходимо задать рабочую область или псевдоним таблицы, в которой вы пытаетесь заблокировать группу записей.
Функция LOCK( ) пытается блокировать сразу все заданные записи. Номера записей в списке cRecordNumberList должны разделяться запятыми. Например, чтобы установить блокировку для первых четырех записей в таблице, список cRecordNumberList должен содержать 1,2,3,4.
Группу записей можно блокировать и иначе: установите указатель записи у той записи, которую вы намерены заблокировать, выдайте функцию LOCK( ) или RLOCK( ), а затем повторите эти действия для всех остальных записей.
В Visual FoxPro в качестве номера записи можно задать 0. Это позволяет блокировать заголовок таблицы.
Результат:
Логический.
Комментарии:
Функция LOCK( ) идентична функции RLOCK( ).
Если блокировка успешно установлена, LOCK( ) возвращает значение "истина" (.T.). Пользователю, установившему блокировку, блокированные записи остаются доступными для чтения и записи; всем остальным пользователям сети они доступны только для чтения.
Выполнение функции LOCK( ) не гарантирует успешную установку блокировки записей. Нельзя блокировать запись, которую уже заблокировал другой пользователь или которая находится в таблице, блокированной другим пользователем. Если одна или несколько записей не могут быть блокированы по той или иной причине, LOCK( ) возвращает значение "ложь" (.F.).
По умолчанию функция LOCK( ) предпринимает только одну попытку заблокировать запись. Установка SET REPROCESS позволяет задать автоматическое повторение блокирования записи, если первая попытка оказывается неудачной. Эта установка определяет число попыток блокировки или интервал, в течение которого эти попытки следует повторять при неудачной первой попытке. Подробнее об этом см. команду SET REPROCESS.
Команда SET MULTILOCKS определяет, можно ли блокировать группу записей в таблице. Если установка SET MULTILOCKS имеет значение OFF (по умолчанию), вы можете блокировать только одну запись в таблице. Если действует SET MULTILOCKS ON, вы можете блокировать сразу несколько записей в таблице. Подробнее см. тему SET MULTILOCKS.
Важное замечание. Заголовок таблицы следует оставлять заблокированным в течение как можно более короткого интервала времени, так как остальные пользователи на этот период лишаются возможности добавлять записи в таблицу.
Заголовок таблицы освобождается по команде UNLOCK RECORD 0, UNLOCK или UNLOCK ALL.
Если удалось успешно заблокировать все записи, заданные в списке cRecordNumbers, функция LOCK( ) возвращает значение "истина" (.T.). Если хотя бы одна запись из списка cRecordNumbers не может быть заблокирована, LOCK( ) возвращает значение "ложь" (.F.) и ни одна из этих записей не остается заблокированной. Однако все установленные до этого блокировки записей сохраняются. Блокировка группы записей представляет собой аддитивный процесс. Установка блокировки на какие-либо записи не снимает блокировку с других записей.
Максимальное число записей, которые можно блокировать в каждой из рабочих областей, приблизительно составляет 8000. Но всегда быстрее блокировать всю таблицу целиком, чем группу записей, даже если их всего лишь несколько.
Пример:
* В следующем примере блокируются первые четыре записи в таблицах * customer и employee, а затем блокировка снимается. CLOSE DATABASES OPEN DATABASE (HOME( ) + 'samples\data\testdata') SET REPROCESS TO 3 AUTOMATIC STORE '1,2,3,4' TO gcRecList gcOldExc = SET('EXCLUSIVE') SET EXCLUSIVE OFF SELECT 0 USE employee && Open Employee table SELECT 0 USE customer && Open Customer table ? LOCK('1,2,3,4', 'customer') && Lock 1st 4 records in customer ? RLOCK(gcRecList, 'employee') && Lock 1st 4 records in employee UNLOCK IN customer UNLOCK IN employee SET EXCLUSIVE &gcOldExc