Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СКБД - все лк

.pdf
Скачиваний:
15
Добавлен:
16.03.2016
Размер:
3 Мб
Скачать

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

Например:

где P1, P2, P3 – параллельные транзакции, R – элемент обработки.

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

Устно. Для распознавания тупика периодически производится построение графа ожидания транзакций (иногда граф ожидания поддерживается постоянно), и в этом графе ищутся циклы. Традиционной техникой (для которой существует множество разновидностей) нахождения циклов в ориентированном графе является редукция графа.

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

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

Для простоты изображения можно использовать другое определение графа ожидания.

Определение. Граф ожидания представляет собой ориентированный граф G = (V , E ), состоящий из множества вершин V – определяющих выполняемые транзакций и множества ориентированных ребер или дуг E – формируемых следующим образом:

5.Создается вершина, соответствующая каждой транзакции.

6.Создается дуга A → B, если транзакция A ожидает освобождение элемента данных, заблокированного в настоящее время транзакцией B.

Взаимоблокировка имеет место, если граф ожидания содержит цикл. Например. Построим граф ожидания для примера взаимоблокировки при

устранении проблемы потери результатов обновления (см. график выше).

B: S - locks A: X - locks

Конфликт R –

W

Ожидание…

A B

A:X - locks

B:X - locks

Конфликт W -

W

Ожидание…

СУБД для специальности СП, III курс

Лекция №12

Преднамеренные блокировки

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

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

Пользователь не может владеть блокировкой, конфликтующей с блокировкой, которой уже владеет другой пользователь.

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

Система управления блокировками автоматически захватывает и освобождает блокировки в соответствии с действиями пользователей. Для управления блокировками не требуется никаких действий со стороны DBA (администратора базы данных) или программиста.

Блокировки объектов БД разделяются следующим образом:

Блокировка самой базы данных.

Блокировка файлов базы данных.

Блокировка таблиц базы данных.

Блокировка страниц (Единиц обмена с диском, обычно 2-16 Кб. На одной странице содержится несколько строк одной или нескольких таблиц).

Блокировка отдельных строк таблиц.

Блокировка отдельных полей.

Кроме того, можно блокировать индексы, заголовки таблиц или другие объекты.

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

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

Устно. Современные СУБД, как правило, поддерживают минимальный уровень блокировки на уровне строк или страниц. (В старых версиях

настольной СУБД Paradox поддерживалась блокировка на уровне отдельных полей.).

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

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

Вводятся следующие типы блокировок:

Преднамеренная блокировка с возможностью взаимного доступа (ISблокировка - Intent Shared lock) или Разделяемое намерение. Указывает,

что в транзакции предполагается наложить на ресурс разделяемую блокировку.

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

Преднамеренная блокировка без взаимного доступа (IX-блокировка - Intent eXclusive lock) или Монопольное намерение. Указывает, что в транзакции предполагается наложить на ресурс монопольную

блокировку.

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

Преднамеренная блокировка, как с возможностью взаимного доступа, так и без него (SIX-блокировка - Shared Intent eXclusive lock) или

Разделяемо-монопольное намерение. Указывает, что в транзакции

предполагается наложить разделяемую блокировку на одни ресурсы и монопольную блокировку на другие ресурсы.

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

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

таблицы базы данных) таблица совместимости блокировок имеет следующий вид:

Транзакция B пытается наложить на таблицу блокировку:

Транзакция A наложила

на IS

S

IX

SIX

X

таблицу блокировку:

 

 

 

 

 

IS

Да

Да

Да

Да

Нет

S

Да

Да

Нет

Нет

Нет

IX

Да

Нет

Да

Нет

Нет

SIX

Да

Нет

Нет

Нет

Нет

X

Нет

Нет

Нет

Нет

Нет

Таблица 2 Расширенная таблица совместимости блокировок Более точная формулировка протокола преднамеренных блокировок для

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

1.Прежде чем транзакция наложит S-блокировку на данный кортеж, она должна наложить IS - блокировку или другую более сильную блокировку на отношение, в котором содержится данный кортеж.

2.Прежде чем транзакция наложит Х-блокировку на данный кортеж, она

должна наложить IХ - блокировку или другую более сильную блокировку на отношение, в котором содержится данный кортеж Понятие относительной силы блокировок можно описать при помощи

диаграммы приоритета (сверху - более сильные блокировки, снизу - более слабые):

Таблица 3 Диаграмма приоритета блокировок

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

блокировку строки, на таблицу можно наложить любую из блокировок типа IX, SIX, X.

Устно. Рассмотрим, как разрешается проблема фиктивных элементов (фантомов) с использованием протокола преднамеренных блокировок для доступа к данным.

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

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

Время Транзакция A Транзакция B

S-блокировка таблицы (с ---

целью потом блокировать строки) - успешна

S-блокировка

строк, ---

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

условию

.

 

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

Выборка

строк, ---

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

условию

.

 

(Отобрано n строк)

 

---

IX-блокировка таблицы (с целью потом

 

вставлять строки) - отвергается из-за

 

конфликта с S-блокировкой, наложенной

 

транзакцией A

---

Ожидание…

---

Ожидание…

S-блокировка

строк, Ожидание…

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

условию

.

 

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

Выборка

строк, Ожидание…

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

условию

.

(Отобрано n строк)

 

COMMIT

Ожидание…

блокировки снимаются

 

---

IX-блокировка таблицы (с целью потом

 

вставлять строки) - успешна

---

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

 

условию .

---

COMMIT

Транзакция A дважды читает один и тот же набор строк Все правильно

Результат. Проблема фиктивных элементов (фантомов) решается, если транзакция A использует преднамеренную S-блокировку или более сильную.

Замечание. Т.к. транзакция A собирается только читать строки таблицы, то минимально необходимым условием в соответствии с протоколом преднамеренных блокировок является преднамеренная IS-блокировка таблицы. Однако этот тип блокировки не предотвращает появление фантомов. Таким образом, транзакцию A можно запускать с разными уровнями изолированности - предотвращая или допуская появление фантомов. Причем, оба способа запуска соответствуют протоколу преднамеренных блокировок для доступа к данным.

Уровни изоляции. Манипулирование блокировками средствами SQL.

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

Уровень изоляции рассматривается как некоторое свойство транзакции. Чем выше уровень изоляции, тем меньше степень вмешательства (и параллелизма), а чем ниже уровень изоляции, тем больше степень вмешательства (и параллелизма).

Стандарт SQL предусматривает 4 уровня изоляции:

READ UNCOMMITTED - уровень незавершенного считывания

(возможно считывание объекта после считывания его текущей транзакцией и до ее завершения).

READ COMMITTED - уровень завершенного считывания (возможно считывание объекта только после завершения транзакции).

REPEATABLE READ - уровень повторяемого считывания (возможно считывание объекта после завершения транзакции).

SERIALIZABLE - уровень способности к упорядочению (установление порядка обращения к объектам согласно уровням изоляции).

Уровень read uncommitted является наименее ограничивающим уровнем изолированности, а serializable – наиболее ограничивающим. По мере роста уровня изолированности SQL Server налагает все более ограничивающую блокировку на все более длительные периоды времени.

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

В стандарте SQL выделены три случая нарушения способности к упорядочению, фактически именно те, которые были описаны выше как проблемы параллелизма:

Неаккуратное считывание ("Грязное" чтение, незафиксированная зависимость).

Неповторяемое считывание (Частный случай несовместного анализа).

Фантомы (Фиктивные элементы - частный случай несовместного

анализа).

Потеря результатов обновления стандартом SQL не допускается, т.е. на самом низком уровне изолированности транзакции должны работать так, чтобы не допустить потери результатов обновления.

Устно. Различные уровни изоляции определяются по возможности или исключению этих особых случаев нарушения способности к упорядочению. Эти определения описываются следующей таблицей:

Уровень изоляции

Неаккуратное

Неповторяемое

Фантомы

 

считывание

считывание

 

READ

Да

Да

Да

UNCOMMITTED

 

 

 

READ COMMITTED Нет

Да

Да

REPEATABLE

Нет

Нет

Да

READ

 

 

 

SERIALIZABLE

Нет

Нет

Нет

Таблица 4 Уровни изоляции стандарта SQL

Уровень изоляции транзакции задается следующим оператором: SET TRANSACTION {ISOLATION LEVEL

{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

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

… (предыдущая транзакция выполняется со своим уровнем изоляции) COMMIT;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

COMMIT;

… (следующая транзакция выполняется с уровнем изоляции REPEATABLE READ)

Подсказки блокировки

Подсказки блокировки – это ключевые слова T-SQL, которые используются с операторами SELECT, INSERT, UPDATE и DELETE, чтобы определить для SQL Server использование предпочтительного типа блокировки на уровне таблицы для определенного оператора.

Можно использовать подсказки блокировки для переопределения принятого по умолчанию уровня изолированности.

Устно. Полезность использование подсказок блокировки может быть, например, в следующем случае:

Предположим, что для всех транзакций используется принятый по умолчанию уровень изолированности read uncommitted (чтение незафиксированных данных). При этом уровне изолированности по данному ресурсу захватывается разделяемая блокировка (S-locks) только до завершения чтения, и затем она освобождается. Если какая-либо транзакция читает одни и те же данные дважды, то результаты чтения могут не совпасть, поскольку другая транзакция могла захватить блокировку между первым и вторым чтениями и модифицировать эти данные.

Чтобы избежать проблемы повторяемости чтения, можно задать уровень изолированности serializable (упорядочиваемость), но это вынудит SQL Server захватить все разделяемые блокировки (S-locks), необходимые для операторов SELECT во всех транзакциях, пока не будет завершена каждая транзакция. Иными словами, для целостности транзакций разделяемые блокировки (S-locks) будут захвачены по таблице, указанной в операторе SELECT любой транзакции.

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

Описание существующих подсказок блокировки на уровне таблиц.

1.HOLDLOCK. Захватывает разделяемую блокировку до завершения транзакции, а не освобождает ее сразу после того, как уже не требуется соответствующая таблица, страница или строка данных. Эквивалентно использованию подсказки блокировки SERIALIZABLE.

2.NOLOCK. Применяется только к оператору SELECT. Не получает разделяемых блокировок и не поддерживает монопольных блокировок; читает данные, которые монопольно захвачены другой транзакцией. Эта подсказка позволяет читать нефиксированные данные (dirty read).

3.PAGLOCK. Используется для блокировки на уровне страницы там, где обычно используется блокировка на уровне таблицы.

4.READCOMMITTED. Выполняется считывание с тем же поведением по блокировкам, как у транзакций, использующих уровень изолированности read committed (принятый по умолчанию уровень изолированности для SQL Server).

5.READPAST. Применяется только к оператору SELECT и только к строкам, блокированным с помощью блокировки на уровне строк. Пропускаются строки, блокированные другими транзакциями, которые обычно включаются в набор результатов; возвращает результаты без этих блокированных строк. Может использоваться только с транзакциями, выполняемыми на уровне изолированности read committed.

6.READUNCOMMITTED. Эквивалентно NOLOCK.

7.REPEATABLEREAD. Выполняется считывание с тем же поведением по блокировкам, как у транзакций, использующих уровень изолированности repeatable read.

8.ROWLOCK. Используются блокировки на уровне строк вместо блокировки на уровне страниц или на уровне таблиц.

9.SERIALIZABLE. Выполняется считывание с тем же поведением по

блокировкам, как у транзакций, использующих уровень изолированности serializable. Эквивалентно HOLDLOCK.

10.TABLOCK. Используется блокировка на уровне таблиц вместо блокировки на уровне страниц или на уровне строк. SQL Server захватывает эту блокировку до завершения оператора.

11.TABLOCKX. Используется монопольная блокировка по таблице. Внимание! Эта подсказка препятствует доступу других транзакций к этой таблице.

12.UPDLOCK. Используются блокировки изменения вместо монопольных блокировок при чтении таблицы. Эта подсказка позволяет другим пользователям только читать данные и позволяет текущей транзакции изменять эти данные; тем самым никакой другой пользователь не сможет модифицировать эти данные после того, как текущая транзакция в последний раз прочитали их.

Например. Подсказка блокировки HOLDLOCK в операторе SELECT указывает SQL Server захват всех разделяемых блокировок (S-locks) по таблице, заданной в операторе транзакции SELECT, вплоть до конца этой транзакции – независимо от уровня изолированности. Тем самым при повторном чтении будет наблюдаться согласованность данных (они не будут изменены другой транзакцией). Использование подсказок блокировки не влияет на уровень изолированности для других транзакций.

Можно объединять совместимые подсказки блокировки, такие как TABLOCK и REPEATABLEREAD, но нельзя объединять конфликтующие подсказки, такие как REPEATABLEREAD и SERIALIZABLE.

Чтобы задать подсказку блокировки на уровне таблиц, необходимо заключить эту подсказку в круглые скобки после имени таблицы в операторе T- SQL.

Следующая последовательность является примером использования подсказок TABLOCKX в операторе SELECT: