Блокировки
Сеанс, заблокировавший таблицу, пользуется нормальным доступом; блокировка распространяются на другие сеансы, пытающиеся получить доступ к заблокированной таблице. Блокировка таблиц возможна только в транзакциях, блокировка вне транзакционного блока не приводит к ошибке, но установленная блокировка немедленно снимается.
Общий синтаксис:
- LOCK [ TABLE ] таблица IN режим
режим::- { [ ROW | ACCESS ] { SHARE | EXCLUSIVE } | SHARE ROW EXCLUSIVE } MODE
- LOCK [ TABLE ] таблица
устанавливает максимально жесткий режим блокировки (ACCESS EXCLUSIVE)
Уровни блокировок:
- ACCESS SHARE MODE. Устанавливается автоматически командой SELECT для таблиц, из которых производится выборка данных. В заблокированных таблицах запрещается выполнение команд ALTER TABLE, DROP TABLE и VACUUM. В этом режиме для заблокированных таблиц также запрещаются параллельные блокировки уровня ACCESS EXCLUSIVE MODE.
- ROW SHARE MODE. Устанавливается автоматически командами SELECT, содержащими секцию FOR UPDATE или FOR SHARE. В заблокированных таблицах запрещается выполнение команд ALTER TABLE, DROP TABLE и VACUUM. В этом режиме для заблокированных таблиц также запрещаются параллельные блокировки уровней EXCLUSIVE MODE и ACCESS EXCLUSIVE MODE.
- ROW EXCLUSIVE MODE. Устанавливается автоматически командами UPDATE, INSERT и DELETE. В заблокированных таблицах запрещается выполнение команд ALTER TABLE, DROP TABLE и CREATE INDEX. В этом режиме для заблокированных таблиц также запрещаются параллельные блокировки уровней SHARE MODE, SHARE ROW EXCLUSIVE MODE, EXCLUSIVE MODE и ACCESS EXCLUSIVE MODE.
- SHARE UPDATE EXCLUSIVE MODE. Устанавливается автоматически командами VACUUM (без FULL), ANALYZE и CREATE INDEX CONCURRENTLY.
- SHARE MODE. Устанавливается автоматически командами CREATE INDEX (без CONCURRENTLY). В заблокированных таблицах запрещается выполнение команд INSERT, UPDATE, DELETE, ALTER TABLE, DROP TABLE и VACUUM. В этом режиме для заблокированных таблиц также запрещаются параллельные блокировки уровней ROW EXCLUSIVE MODE, SHARE ROW EXCLUSIVE MODE, EXCLUSIVE MODE и ACCESS EXCLUSIVE MODE.
- SHARE ROW EXCLUSIVE MOOE. Специальный режим блокировки, практически идентичный режиму EXCLUSIVE MODE, но допускающий установку параллельных блокировок уровня ROW SHARE MODE.
- EXCLUSIVE MODE. Запрещает выполнение команд INSERT, UPDATE, DELETE, CREATE INDEX, ALTER TABLE, DROP TABLE и VACUUM, а также команд SELECT с секцией FOR UPDATE. В этом режиме для заблокированных таблиц также запрещаются параллельные блокировки уровней ROW SHARE MODE, ROW EXCLUSIVE MODE, SHARE MODE, SHARE ROW EXCLUSIVE MODE и ACCESS EXCLUSIVE MODE.
- ACCESS EXCLUSIVE MODE. Устанавливается автоматически командами ALTER TABLE, DROP TABLE и VACUUM. В этом режиме для заблокированных таблиц запрещаются любые команды или параллельные блокировки любого уровня.
Какие типы блокировок могут существовать в системе?
Типы блокировок
В Vi&ual FoxPro вы можете использовать два типа блокировок: блокировку таблицы и записи. Блокировка таблицы запрещает доступ другим пользователям ко всей таблице, пока вы редактируете одну или несколько записей. Применение блокировки записи не допускает изменения записи кем-либо, кроме пользователя, установившего блокировку.
По возможности следует использовать блокировку записи, потому что она запрещает изменение только одной записи, а не всей таблицы. Например, пока вы редактируете запись о покупателе Иванове, кто-нибудь может работать с записью о покупателе Петрове. И вы оба можете совершать изменения, не мешая друг другу и не беспокоясь за действия другого.
Автоматическая блокировка
В Visual FoxPro может осуществляться автоматическая или ручная блокировка данных. При использовании определенных команд FoxPro попытается автоматически заблокировать записи или всю таблицу (табл. 20.1).
Таблица 20.1. Команды, автоматически блокирующие таблицу или записи
Команда | Что блокируется |
ALTER TABLE | Вся таблица |
APPEND | Вся таблица |
APPEND BLANK | Заголовок таблицы |
APPEND FROM | Вся таблица |
APPEND FROM ARRAY | Заголовок таблицы |
APPEND MEMO | Текущая запись |
BLANK | Текущая запись |
BROWSE | Текущая запись и все записи из одноименных полей в связанных таблицах |
CHANGE | Текущая запись и все записи из одноименных полей в связанных таблицах |
DELETE | Текущая запись |
DELETE NEXT 1 | Текущая запись |
DELETE <n> | Если л больше 1, автоматически блокируется вся таблица |
DELETE RECORD <n> | Автоматически блокирует п записей |
DELETE SQL | Текущая запись |
EDIT | Текущая запись и все записи из одноименных полей в связанных таблицах |
GATHER | Текущая запись |
INSERT | Вся таблица |
INSERT SQL | Заголовок таблицы |
MODIFY MEMO | Когда начинается редактирование записи, автоматически блокирует ее |
READ | Текущая запись |
RECALL | Текущая запись |
RECALL NEXT 1 | Автоматически блокирует указанную запись |
RECALL RECORD <n> | Блокирует п записей |
RECALL <n> | Если п больше 1, автоматически блокируется вся таблица |
REPLACE | Текущая запись |
REPLACE NEXT 1 | Автоматически блокирует указанную запись |
REPLACE RECORD <n> | Блокирует п записей |
SHOW GETS | Текущая запись |
TABLEUPDATEO | Вся таблица |
UPDATE | Вся таблица |
UPDATE SQL | Вся таблица |