« Назад
Функция
FLOCK([nWorkArea | cTableAlias])
выполняет попытку заблокировать текущую или указанную таблицу. Возвращает .T., если таблица заблокирована, или .F., если таблица или ее запись (записи) заблокированы другим пользователем. Также функция вернет .F., если в рабочей области таблица не открыта.
Заблокированная таблица может изменяться только пользователем, выполнившим блокировку; остальным пользователям таблица доступна только для чтения.
Таблица остается заблокированной до тех пор, пока ее не освободит пользователь, выполнивший блокировку. Таблица может быть разблокирована командой UNLOCK или в результате своего закрытия, или в результате завершения работы VFP (выполнения команды QUIT). Закрывают таблицы команды USE, CLEAR ALL и CLOSE DATABASES.
По умолчанию FLOCK( ) пытается заблокировать таблицу 1 раз. Число попыток изменяет команда SET REPROCESS.
Если между таблицами установлена связь (команда SET RELATION), то блокировка одной таблицы не влечет блокировку другой.
Пример:
close databases
open database d:\HomeLibrary\HomeLibrary.dbc
use Authors
select Authors
set reprocess to 3 seconds
if Flock( )
&& Таблица Authors успешно заблокирована
replace all Author with Proper(Author)
&& Освобождаем таблицу Authors
unlock
browse last
else
wait window 'Таблица в настоящий момент для изменения недоступна!' nowait
endif
Функция
LOCK([nWorkArea | cTableAlias] | [cRecordNumberList, nWorkArea | cTableAlias])
или
RLOCK([nWorkArea | cTableAlias] | [cRecordNumberList, nWorkArea | cTableAlias])
пытается заблокировать одну или более записей текущей или указанной таблицы. Возвращает .T., если заданные записи заблокированы, или .F., если таблица или указанные записи заблокированы другим пользователем. Также функция вернет .F., если в указанной рабочей области таблица не открыта.
Заблокированные записи могут изменяться только пользователем, выполнившим их блокировку. Остальным пользователям они доступны только для чтения.
Функции LOCK( ) и RLOCK( ) идентичны.
Параметр:
cRecordNumberList – строка, содержащая список номеров блокируемых записей. Если параметр cRecordNumberList употреблен, задание параметра nWorkArea | cTableAlias обязательно. Блокировка нескольких записей возможна, когда SET MULTILOCKS установлен в ON.
Номера записей в списке cRecordNumberList разделяются запятыми, например:
LOCK('1, 2, 3, 4', 'Authors')
Блокировка нескольких записей может быть выполнена в результате неоднократного позиционирования на нужной записи и выполнения LOCK( ) или RLOCK( ).
Если cRecordNumberList содержит 0, то выполняется попытка заблокировать заголовок таблицы.
Если заголовок таблицы заблокирован, то другие пользователи не могут добавлять в нее записи.
Освобождается заголовок в результате выполнения UNLOCK RECORD 0, UNLOCK или UNLOCK ALL.
Блокировка записей, когда SET MULTILOCKS установлен в ON, является аддитивным процессом: каждый новый успешный вызов LOCK( ) добавляет к ранее заблокированным записям новые либо указанные в списке cRecordNumbers, либо текущую. Записи, заблокированные предшествующими вызовами LOCK( ), не освобождаются.
Максимальное число записей, которое можно заблокировать в каждой рабочей области, около 8000. Всегда быстрее заблокировать всю таблицу, чем даже небольшое число ее записей.
По умолчанию LOCK( ) пытается заблокировать запись 1 раз. Число попыток изменяет команда SET REPROCESS.
Освободить записи может только заблокировавший их пользователь. Записи могут быть разблокированы командой UNLOCK, а также в результате закрытия таблицы или завершения работы VFP.
Функция
ISFLOCKED([nWorkArea | cTableAlias])
возвращает .T., если таблица заблокирована, или .F. – в противном случае. Результат возвращается для текущей или заданной параметром nWorkArea | cTableAlias таблицы.
Функция возвращает .T. только на рабочей станции, с которой выполнена блокировка таблицы.
Функция
ISRLOCKED([nRecordNumber, [nWorkArea | cTableAlias]])
возвращает .T., если текущая запись или запись с номером nRecordNumber заблокирована, или .F. – в противном случае. Результат возвращается для текущей или заданной параметром nWorkArea | cTableAlias таблицы.
Функция возвращает .T. только на рабочей станции, с которой выполнена блокировка записи.
Функция
SYS(2011)
возвращает строку, содержащую статус блокировки таблицы или ее записи, открытой в текущей рабочей области. Например: "Exclusive", "Record Unlocked" или "File Locked".
Функция
SYS(3052, nFileType, [lHonorReprocess])
определяет, будет ли VFP использовать установку SET REPROCESS при попытке заблокировать индексный или memo-файл. Возвращает символ "0" или "1", что соответствует .F. или .T.
Параметры:
nFileType – задает тип файла, к которому применяется функция SYS(3052):
-
1 – индексные файлы;
-
2 – memo-файлы.
lHonorReprocess – VFP будет использовать установку SET REPROCESS, если параметр равен .T., для файлов, имеющих тип, заданный параметром nFileType, и не будет, если равен .F. (по умолчанию). Если lHonorReprocess = .F., то VFP бесконечно ожидает завершения процесса блокировки.
Если параметр lHonorReprocess опущен, то функция вернет свою текущую установку для файлов с типом nFileType.
Правильнее использовать значение .T.; это позволит уменьшить риск состязаний за право заблокировать файл при выполнении транзакций.
|