Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / Lfg / Алгоритмы совместного доступа к базам данных.doc
Скачиваний:
59
Добавлен:
16.04.2013
Размер:
124.93 Кб
Скачать

Разделяемые блокировки

Разделяемая блокировка (shared lock),установленная для ресурса базы данных, предоставляет транзакциям право на коллективный доступ к этому ресурсу — другие транзакции также могут запрашивать разделяемые блокировки того же ресурса. Например, обе транзакции, изображенные на рис. 1, установили разделяемую блокировку одной и той же таблицы. Это позволяет каждой транзакции обновлять разные строки одной таблицы в одно и то же время.

Разделяемые блокировки обеспечивают высокую степень параллельности транзакций. Однако транзакции не всегда способны запрашивать разделяемые блокировки всех видов ресурсов и операций. Например, каждая из транзакций на рис. 1 может установить разделяемую блокировку одной и той же таблицы в одно и то же время. Тем не менее, каждая из транзакций запрашивает еще и исключающие блокировки строк, которые она обновляет, так что другие транзакции не могут параллельно обновлять те же строки и приводить к потере изменений.

Исключающие блокировки

В противоположность разделяемой исключающая блокировка (exclusive lock)ресурса предоставляет транзакции право на монопольный доступ к этому ресурсу. После того как транзакция 1 на рис. 1 запрашивает исключающую блокировку строк 1 и 2. другие транзакции не могут устанавливать разделяемые или исключающие блокировки этих строк до тех пор, пока транзакция 1 не будет завершена или не будет произведен ее откат.

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

Блокировки dml

Когда транзакция выполняет операции DML(INSERT,UPDATEиDELETE),Oracleавтоматически устанавливает блокировки таблиц и индексов, чтобы обеспечить высокую степень параллельности и предотвратить конфликты между транзакциями.DMLOracleможет устанавливать как строчные, так и табличные блокировки. Далее подробно рассказано об этих блокировках и об их использовании во время обработки транзакций.

Строчные блокировки

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

Например, если в транзакции содержится приведенный ниже оператор, она устанавливает исключающую блокировку указанной строки таблицы CUSTOMERS:

UPDATE sales.customers

SET ...

WHERE last_name='Ellison' AND first_name='Lawrence';

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

Если планируется обновление строк, транзакция может установить исключающие блокировки определенных строк таблицы при помощи оператора SELECT...FORUPDATE. Например, когда в транзакции содержится следующий оператор, она устанавливает исключающие блокировки всех записей о клиентах, чей почтовый индекс равен 95000:

SELECT * FROM sales.customers

WHERE zipcode = 95000

FOR UPDATE

NOWAIT;

Когда в операторе SELECT...FORUPDATEуказано ключевое словоNOWAIT(не ждать),Oracleпередает управление пользователю, если сам не может немедленно установить строчные блокировки всех указанных строк. Без ключевого словаNOWAITоператорSELECT...FORUPDATEбудет выполнен только после того, как транзакция сможет установить строчные блокировки всех указанных строк.