Главная » SQL, Базы данных » БЛОКИРОВКА

0

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

Ниже приведено более подробное описание того, по какому принципу работает блокировка.

1.  Прежде всего, предположим, что в системе поддерживаются блокировки двух ти пов: исключительные блокировки (блокировки X — exclusive) и разделяемые блоки ровки (блокировки S — shared), которые определены, как указано в следующих двух абзацах.

Примечание. Блокировки X и S иногда именуются, соответственно, блокировками записи и блокировками чтения. Если не указано иное, то в данной главе предполагается, что блокировки X и S являются единственными доступными типами блокировок; описание других типов блокировок приведено в разделе 16.9. Кроме того, если не указано иное, предполагается, что единственными типами объектов базы данных, которые могут быть заблокированы, являются кортежи; описание других возможностей также приведено в разделе 16.9.

2.  Если транзакция А владеет исключительной блокировкой (X), то запрос от неко торой другой транзакции в на получение блокировки кортежа t любого типа не может быть немедленно удовлетворен.

3.  Если транзакция А владеет разделяемой блокировкой (S) кортежа t, то выполня ются следующие условия:

■     запрос некоторой другой транзакции в на получение блокировки X кортежа t

не может быть немедленно удовлетворен;

■     запрос некоторой другой транзакции в на получение блокировки S кортежа t может и должен быть немедленно удовлетворен (это означает, что с этого вре мени транзакция в также будет владеть блокировкой S кортежа).

Эти правила можно успешно подытожить с помощью матрицы совместимости типов блокировок (рис. 16.5). Такая матрица интерпретируется следующим образом: рассмотрим некоторый кортеж t и предположим, что транзакция А в настоящее время владеет блокировкой на t, которая обозначена одной из записей в заголовках столбцов (дефис

обозначает, что блокировка отсутствует), а также предположим, что некоторая  другая транзакция в выдает запрос на получение блокировки t, которая  обозначена одной из записей в заголовках строк (для полноты здесь также предусмотрен случай "отсутствия блокировки"). В этой матрице "N" указывает на конфликт (запрос транзакции в не может быть немедленно удовлетворен), a "Y" указывает на совместимость (запрос транзакции в может и должен быть немедленно удовлетворен). Очевидно, что эта матрица является симметричной.

Рис. 16.5. Матрица совместимости

‘для блокировок типов X и S

Теперь перейдем к описанию протокола доступа к данным, или протокола блокировки,

который позволяет использовать только что описанные блокировки X и S для обеспечения того, чтобы никогда не возникали проблемы, описанные в разделе 16.2.

1.          Транзакция, в которой требуется выполнить выборку кортежа, должна вначале приобрести блокировку S на этот кортеж.

2.          Транзакция, в которой требуется выполнить обновление кортежа, должна вначале приобрести X блокировку на этот кортеж. В ином случае, если она уже владеет блокировкой S на этом кортеже, как происходит в ситуации, когда выполняется последовательность операций выборки и обновления (RETRIEVE и UPDATE), то эта транзакция должна, как принято называть такое действие, расширить, или по высить уровень блокировки S до уровня X.

Примечание. В этот момент необходимо прервать изложение, чтобы пояснить, что запросы на получение блокировок обычно бывают неявными — операция выборки кортежа неявно запрашивает блокировку S на соответствующий кортеж, а операция обновления кортежа неявно  запрашивает  блокировку X (или неявно запрашивает расширение существующей блокировки S до уровня X) на соответствующий кортеж. Кроме того, в этом описании, как обычно, под операцией обновления подразумеваются любые операции  вставки (INSERT) и удаления  (DELETE), а  также обновления (UPDATE) как таковые, но рассматриваемые правила требуют определенного уточнения с учетом особенностей операторов INSERT и DELETE. В данном разделе дополнительные сведения по этому вопросу не приведены.

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

Примечание. Выше было применено выражение "не раньше, чем", поскольку после освобождения блокировки транзакцией А может быть удовлетворен другой запрос на

блокировку  соответствующего  кортежа,  но  это  будет  не  запрос   транзакции   В, поскольку  освобождения  блокировки  могут  также  ожидать   другие  транзакции. Безусловно, система должна обеспечить, чтобы  транзакция  в не ожидала до бесконечности (такая ситуация называется  активным тупиком — livelock, или истощением ресурсов — starvation). Один из простых предотвращения такой ситуации состоит в том, чтобы запросы на  блокировку обслуживались в порядке простой очереди ("первым поступил—первым обслуживается"). 4. Блокировки X освобождаются по  завершении транзакции (COMMIT или ROLLBACK). Блокировки S также обычно освобождаются в это время (по крайней мере, такого предположения мы  будем придерживаться до раздела 16.8).

Описанный выше протокол называется строгим протоколом двухфазной блокировки. Он рассматривается более подробно в разделе 16.6. В частности, в этом разделе указано, почему он получил такое название.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии