Пытается блокировать одну или несколько записей в таблице.

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. Это позволяет блокировать заголовок таблицы.

NoteNote

Заголовок таблицы следует оставлять заблокированным в течение как можно более короткого интервала времени, так как остальные пользователи на этот период лишаются возможности добавлять записи в таблицу.

Заголовок таблицы освобождается по команде UNLOCK RECORD 0, UNLOCK или UNLOCK ALL.

Если удалось успешно заблокировать все записи, заданные в списке cRecordNumbers , функция LOCK( ) возвращает значение "истина" (.T.). Если хотя бы одна запись из списка cRecordNumbers не может быть заблокирована, LOCK( ) возвращает значение "ложь" (.F.) и ни одна из этих записей не остается заблокированной. Однако все установленные до этого блокировки записей сохраняются. Блокировка группы записей представляет собой аддитивный процесс. Установка блокировки на какие-либо записи не снимает блокировку с других записей.

Максимальное число записей, которые можно блокировать в каждой из рабочих областей, приблизительно составляет 8,000. Но всегда быстрее блокировать всю таблицу целиком, чем группу записей, даже если их всего лишь несколько.

Expand imageВозвращаемое значение

Logical

Expand imageПримечания

Функция LOCK( ) идентична функции RLOCK( ).

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

Если блокировка или блокировки успешно установлены, LOCK( ) возвращает значение "истина" (.T.). Пользователю, установившему блокировку, блокированные записи остаются доступными для чтения и записи; всем остальным пользователям сети они доступны только для чтения.

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

По умолчанию функция LOCK( ) предпринимает только одну попытку заблокировать запись. становка SET REPROCESS позволяет задать автоматическое повторение блокирования записи, если первая попытка оказывается неудачной. Эта установка определяет число попыток блокировки или интервал, в течение которого эти попытки следует повторять при неудачной первой попытке. Для получения дополнительной информации, смотрите SET REPROCESS.

Команда SET MULTILOCKS определяет, можно ли блокировать группу записей в таблице. Если установка SET MULTILOCKS имеет значение OFF (по умолчанию), вы можете блокировать только одну запись в таблице. Если действует SET MULTILOCKS ON, вы можете блокировать сразу несколько записей в таблице. Для получения дополнительной информации, смотрите SET MULTILOCKS.

Снятие блокировки с записей   Снять блокировку с табличной записи может только пользователь, установивший эту блокировку. Освободить запись можно командой UNLOCK, закрыв таблицу или выйдя из Visual FoxPro.

С помощью команды UNLOCK можно освободить записи в текущей рабочей области, в другой конкретной рабочей области или во всех рабочих областях. Для получения дополнительной информации, смотрите UNLOCK.

При переключении установки SET MULTILOCKS со значения ON на OFF или наоборот неявно выполняется команда UNLOCK ALL ѕ снимается блокировка со всех записей во всех рабочих областях.

Таблицы можно закрывать с помощью команд USE, CLEAR ALL или CLOSE DATABASES.

Подробнее о блокировке записей и файлов и о совместном использовании таблиц в сети, смотрите Программирование для распределенного доступа.

Expand imageПример

В следующем примере блокируются первые четыре записи в таблицах customer и employee, а затем блокировка снимается.

  CopyCode imageCopy Code
CLOSE DATABASES
OPEN DATABASE (HOME(2) + '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

Expand imageСмотрите также