Скачиваний:
38
Добавлен:
01.04.2014
Размер:
539.65 Кб
Скачать

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

Соседние файлы в папке Дейтл Введ в БД