- •Часть IV
- •Глава 13 Восстановление
- •13.1. Введение
- •13.2. Транзакции
- •13.3. Восстановление транзакции
- •13.4. Восстановление системы
- •13.5. Восстановление носителей
- •13.6. Двухфазная фиксация
- •13.7. Поддержка языка sql
- •13.8. Резюме
- •Глава 14 Параллелизм
- •14.1. Введение
- •14.2. Три проблемы параллелизма
- •14.3. Блокировка
- •14.4. Решение проблем параллелизма
- •14.5. Тупиковая ситуация
- •14.6. Способность к упорядочению
- •14.7. Уровни изоляции
- •14.8. Преднамеренная блокировка
- •IX s
- •14.9. Поддержка блокировок в sql
- •14.10. Резюме
- •14.13. Papadimitriou с. The Theory of Database Concurrency Control.— Rockville, Md.: Computer Science Press, 1986.
- •Глава 15 Безопасность
- •15.1. Введение
- •15.2. Общие соображения
- •15.3. Избирательное управление доступом
- •15.4. Модификация запроса
- •15.5. Обязательное управление доступом
- •15.6. Шифрование данных
- •Стандарт шифрования данных
- •15.7. Поддержка мер обеспечения безопасности в языке sql
- •15.8. Резюме
14.8. Преднамеренная блокировка
До сих пор в этой главе предполагалось, что блокировке подвергается отдельный кортеж. Однако в принципе не существует никаких ограничений на блокирование больших или меньших единиц данных, например целого отношения, базы данных или (пример противоположного характера) некоторого значения атрибута внутри заданного кортежа. Ситуация такого типа называется степенью дробления блокировок [14.8]. Как обычно, здесь наблюдается некоторый тонкий баланс между степенью дробления и параллелизмом: чем мельче степень дробления, тем выше параллелизм, чем крупнее степень дробления, тем меньше блокировок можно задать и требуется протестировать, а значит, будут меньшие накладные расходы (т.е. требуется меньшее количество необходимых действий). Например, если транзакция накладывает Х-блокировку на целое отношение, то нет необходимости задавать Х-блокировку для отдельных кортежей внутри этого отношения, что в результате приводит к уменьшению общего числа блокировок. С другой стороны, никакая другая параллельная транзакция не в состоянии наложить никаких других блокировок на это отношение или кортежи этого отношения.
Предположим, что транзакция Т задает X-блокировку для некоторого отношения R. В ответ на запрос транзакции Т система должна сообщить о наличии других блокировок, наложенных другими транзакциями на любой кортеж отношения R. И если такая блокировка наложена, то запрос транзакции Т не будет выполнен в данный момент времени. Как система может обнаружить конфликт такого рода? Очевидно, было бы крайне нежелательно проверять, блокируется ли каждый кортеж отношения R какой-либо другой транзакцией, а также задана ли какая-нибудь блокировка для какого-либо кортежа отношения R. Вместо этого можно ввести еще один протокол, а именно протокол преднамеренной блокировки, в соответствии с которым, прежде чем накладывать блокировку на кортеж (вероятно, преднамеренную блокировку, о которой подробнее рассказывается ниже), следует наложить ее на все отношения, в которых этот кортеж находится. Тогда обнаружить конфликтную ситуацию, рассмотренную выше, значительно проще за счет обнаружения блокировки на уровне отношений.
Как уже упоминалось, Х- и S-блокировки можно задавать как для отдельных кортежей, так и для целых отношений. В соответствии с [14.8, 14.9] можно ввести три типа преднамеренных блокировок, которые имеют смысл для целых отношений, но не для отдельных кортежей: преднамеренная блокировка с возможностью взаимного доступа (Intent Shared lock— IS), преднамеренная блокировка без взаимного доступа (Intent exclusive lock — IX), а также преднамеренная блокировка одновременно как с возможностью взаимного доступа, так и без него (Shared Intent eXclusive lock— SIX). Ниже приводятся неформальные определения различных видов блокировок (здесь предполагается, что транзакция Т накладывает блокировку рассматриваемого типа на отношение R), причем для полноты картины также приводятся определения S- и Х-блокировки.
• IS
Транзакция Т накладывает S-блокировки на отдельные кортежи отношения R для того, чтобы гарантировать стабильность этих кортежей при их обработке.
• IX
В дополнение к действиям, описанным в приведенной выше формулировке, транзакция Т может осуществить обновление отдельных кортежей отношения R, а потому на эти кортежи накладываются Х-блокировки.
• S
Транзакцией Т допускаются параллельные считывания для отношения R, но не обновления. Сама по себе транзакция T не может обновлять любые кортежи отношения R.
• SIX
В определении этой блокировки комбинируются определения S- и IX-блокировки, т.е. транзакцией T допускаются параллельные считывания для отношения R, но не обновления. В дополнение к этому транзакция Т может осуществить обновление отдельных кортежей отношения R, а потому на эти кортежи накладываются Х-блокировки.
• Х
Транзакцией Т вовсе не допускаются параллельные запросы к отношению R. Сама по себе транзакция T либо может, либо не может обновлять любые кортежи отношения R.
Формальные определения этих типов блокировок можно дать с помощью показанной на рис. 14.11 матрицы совместимости, которая является расширенной версией матрицы, представленной выше в этой главе.
|
X
|
SIX
|
IX
|
S
|
IS
|
-
|
Х
|
N
|
N
|
N
|
N
|
N
|
Y
|
SIX
|
N
|
N
|
N
|
N
|
Y
|
Y
|
IX
|
N
|
N
|
Y
|
N
|
Y
|
Y
|
S
|
N
|
N
|
N
|
Y
|
Y
|
Y
|
IS
|
N
|
Y
|
Y
|
Y
|
Y
|
Y
|
—
|
Y
|
Y
|
Y
|
Y
|
Y
|
Y
|
Рис. 14.11. Матрица совместимости, расширенная преднамеренными блокировками
Теперь можно представить более точную формулировку протокола преднамеренной блокировки.
1. Прежде чем транзакция наложит S-блокировку на данный кортеж, она должна наложить IS-блокировку или другую более сильную блокировку на отношение, в котором содержится данный кортеж.
2. Прежде чем транзакция наложит Х-блокировку на данный кортеж, она должна наложить IX-блокировку или другую более сильную блокировку на отношение, в котором содержится данный кортеж.
(Однако следует отметить, что это еще далеко не полное определение, которое приведено в комментариях к [14.8].)
Упомянутое понятие относительной силы блокировок можно объяснить с помощью диаграммы приоритета, представленной на рис. 14.12. Блокировка типа L2 называется более сильной (т.е. находится выше на диаграмме приоритета) по отношению к блокировке L1 тогда и только тогда, когда для любой конфликтной ситуации (N) в столбце блокировки L1 в некоторой строке матрицы совместимости существует также конфликт в столбце блокировки L2 в той же строке (см. рис. 14.11). Обратите внимание, что запрос на задание блокировки, который отвергается для некоторого типа блокировки, также будет отвергнут и для более сильного типа блокировки (таким образом подразумевается, что всегда можно использовать типы блокировки, более сильные по сравнению с той, которая строго необходима в некотором заданном случае.)
X
SIX