Функция LOCK()

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

Синтаксис:

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

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.02.2003