Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными (пособие).pdf
Скачиваний:
280
Добавлен:
21.05.2015
Размер:
5.42 Mб
Скачать

182

После выбора транзакции-жертвы выполняется ее откат, при котором освобождаются блокировки, установленные этой транзакцией. Эта транзакция затем может быть запущена снова.

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

14.6.Уровни изоляции. Объекты синхронизационных блокировок

Одной из проблем, которые существуют при реализации двухфазного протокола синхронизационных захватов, является выбор объекта, который должен быть заблокирован. В рассмотренных выше примерах таким объектом был кортеж отношения. Такой выбор обеспечивает решение многих проблем распараллеливания (сериализации) транзакций. Решение проблемы тупиков было рассмотрено выше. Не решенной, тем не менее, оказалась проблема фиктивных элементов или «фантомов».

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

1)Блокировка всей базы данных (логический объект).

2)Блокировка файлов базы данных (физические объекты для хранения отношений и, возможно, индексов).

3)Блокировка отношения (логический объект, соответствующий множеству кортежей данного отношения).

4)Блокировка страницы (физический объект, являющийся единицей обмена с диском, хранящий кортежи одного или нескольких отношений, индексную или служебную информацию).

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

6)Иногда рассматривают блокировку отдельных полей отношений, заголовков отношений, индексов и других объектов баз данных.

Выбор уровня объекта для синхронизационного захвата (неважно, какой этот объект – логический или физический) непосредственным образом связан с

183

проблемой оптимизации распараллеливания транзакций. Чем крупнее блокируемый объект, тем меньше синхронизационных захватов будет поддерживаться в системе и, следовательно, тем меньше связанные с ними накладные расходы системы. Более того, если в качестве уровня объекта блокировки выбрать файл или отношение, то будет решена и проблема фантомов. Действительно, в этом случае оказывается невозможным добавление строки-фантома никакой другой транзакцией.

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

Чем мельче блокируемые объекты, тем естественно вероятность возникновения конфликтов при их блокировках будет меньше, однако при этом резко возрастает количество блокировок, особенно при выполнении транзакций над большим числом объектов.

Современные промышленные СУБД, как правило, поддерживают минимальный уровень блокировки на уровне кортежей или страниц. Хотя можно представить себе, когда, например, в качестве минимального объекта блокировки будет выступать отдельные атрибуты (поля) кортежей.

Необходимость решения проблемы оптимизации выбора уровня объекта синхронизационных захватов привела к разработке аппарата так называемых

гранулированных синхронизационных захватов или протокола блокировок по намерению (intent locking).

14.7.Гранулированные синхронизационные блокировки. Блокировки по намерению

При использовании протокола гранулированных блокировок (блокировок по намерению), являющегося расширением рассмотренного выше протокола блокировок, синхронизационные захваты или блокировки могут применяться к объектам разного уровня: к файлам, к отношениям, к страницам и к кортежам. Требуемый уровень объекта определяется тем, какая конкретная операция выполняется. Например, для выполнения операции уничтожения отношения объектом блокировки должно быть все отношение, а для удаления кортежа – сам этот кортеж. Как известно объект любого уровня может быть захвачен в режиме S (разделяемом) или режиме X (монопольном).

184

Наиболее важным отличием рассматриваемого протокола гранулированных захватов является введение новых типов блокировок – так называемых блокировок по намерению (intent locking). Перед захватом объекта в режиме S (Shared lock – разделяемая блокировка) или X (eXlusive lock – монопольная блокировка) соответствующий объект более верхнего уровня должен быть заблокирован в режимах IS, IX, SIX, являющихся блокировками по намерению, то есть блокировками, устанавливаемыми при намерении установить в конечном итоге блокировку S или X.

IS Intent Share lock блокировка по намерению совместного доступа.

Эта блокировка накладывается на некоторый составной объект О и означает намерение блокировать некоторый входящий в О более мелкий объект в режиме S-блокировки. Например, при намерении читать кортежи из отношения О, это отношение должно быть заблокировано в режиме IS (до этого в таком режиме должен быть заблокирован файл).

IX Intent eXclusive lock блокировка по намерению монопольного доступа. Эта блокировка по отношению к некоторому составному объекту О означает намерение захватить некоторый входящий в О более мелкий объект в монопольном (X) режиме. Например, при намерении удалять кортежи из отношения R, это отношение должно быть заблокировано в режиме IX, а до этого в таком же режиме должен быть заблокирован файл.

SIX – Shared Intent eXclusive lock – блокировка по намерению блокировки с совместным доступом или с монопольным. По отношению к некоторому составному объекту О эта блокировка означает совместную блокировку всего этого объекта с намерением впоследствии захватывать какие-либо входящие в него объекты в режиме монопольного доступа. Например, если выполняется длинная операция просмотра отношений с возможностью удаления некоторых из просматриваемых кортежей, то

экономичнее всего заблокировать это отношение в режиме SIX, а до этого заблокировать файл в режиме IS.

Блокировки IS, IX и SIX должны накладываться на сложные объекты базы данных (таблицы, файлы, страницы). Кроме того, на сложные объекты могут накладываться и блокировки типов S и X. Для сложных объектов (например, для таблицы базы данных) таблица совместимости блокировок имеет следующий вид.

185

 

Транзакция В пытается наложить

Транзакция А заблокировала объект

 

блокировку:

 

блокировкой:

IS

S

IX

SIX

X

IS

Да

Да

Да

Да

Нет

S

Да

Да

Нет

Нет

Нет

IX

Да

Нет

Да

Нет

Нет

SIX

Да

Нет

Нет

Нет

Нет

X

Нет

Нет

Нет

Нет

Нет

Более точная формулировка протокола блокировок по намерению доступа к данным выглядит следующим образом:

1.При задании Х-блокировки для сложного объекта неявным образом задается Х-блокировка для всех дочерних объектов этого объекта.

2.При задании S- или SIX-блокировки для сложного объекта неявным образом задается S блокировка для всех дочерних объектов этого объекта.

3.Прежде чем транзакция наложит S- или IS-блокировку на заданный объект, она должна задать IS-блокировку (или более сильную) по крайней мере, для одного родительского объекта этого объекта.

4.Прежде чем транзакция наложит X-, IX- или SIX-блокировку на заданный объект, она должна задать IX-блокировку (или более сильную) для всех родительских объектов этого объекта.

5.Прежде чем для данной транзакции будет отменена блокировка для данного объекта, должны быть отменены все блокировки для дочерних объектов этого объекта.

Понятие относительной силы блокировок можно описать при помощи следующей диаграммы приоритета (сверху – более сильные блокировки, снизу

– более слабые):

X

SIX

S IX

IS

Рис. 14.3. Диаграмма приоритета блокировок

Можно обратить внимание на то, что протокол блокировок по намерению не определяет однозначно, какие блокировки должны быть наложены на

186

родительский объект при блокировании дочернего объекта. Например, при намерении задать S-блокировку кортежа отношения, на отношение, включающее этот кортеж, вообще говоря, можно наложить любую из блокировок типа IS, S, IX, SIX, X. При намерении задать Х-блокировку кортежа, на отношение можно наложить любую из блокировок типа IX, SIX, X. Конкретный выбор осуществляется из контекста выполняемой транзакции.

Посмотрим, как разрешается проблема фиктивных элементов (фантомов)

с использованием протокола блокировок по намерению при доступе к данным. Транзакция А дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция В, которая добавляет

новую строку, удовлетворяющую условию отбора.

187

Транзакция А

Время

Транзакция В

 

 

 

 

 

Блокирует отношение IS-блокировкой

t1

 

с намерением потом блокировать

---

кортежи

 

Блокирует S-блокировкой кортежи,

t2

 

удовлетворяющие условию α

---

(заблокировано n строк)

 

Выборка кортежей, удовлетворяющих

t 3

---

условию α (выбрано n строк)

 

 

Попытка IX-блокировки отношения с

---

t43

намерением потом вставить кортеж

отвергается из-за конфликта с S-

 

---

блокировкой транзакции А

t 5

Ожидание…

Блокирует S-блокировкой кортежи,

 

t 6

Ожидание…

удовлетворяющие условию α

 

(заблокировано n строк)

Ожидание…

Выборка кортежей, удовлетворяющих

t 7

условию α (выбрано n строк)

 

Фиксация транзакции

t 8

Ожидание…

и снятие блокировок

 

 

Блокирует отношение IX-блокировкой

---

t 9

с намерением потом вставить кортеж

 

(теперь разрешается)

---

t 10

Вставка нового кортежа,

удовлетворяющего условию а

 

---

t 11

Фиксация транзакции

и снятие блокировок

 

Транзакция А дважды корректно

 

 

 

выбирает n строк

 

 

Все правильно

 

 

Транзакция В перед попыткой вставить новую строку должна наложить на таблицу IX-блокировку, или более сильную (SIX и Х). Тогда транзакция А, для предотвращения возможного конфликта, должна наложить такую блокировку на таблицу, которая не позволила бы транзакция В наложить IX-блокировку. По таблице совместимости блокировок определяем, что транзакция А должна наложить на таблицу S, или SIX, или Х-блокировку. (Блокировки IS недостаточно, т.к. эта блокировка позволяет транзакции В наложить IX – блокировку для последующей вставки строк).