Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РБД_Ответы.docx
Скачиваний:
11
Добавлен:
17.04.2019
Размер:
6.29 Mб
Скачать

30. Взаимная блокировка - это

Тупиковая ситуация, которая может возникнуть, когда две (или

более) транзакции находятся во взаимном ожидании освобождения

блокировок, удерживаемых каждой из них.

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

запрашивает и осуществляет блокировку для записи элемента данных balx, а в момент времени t3 транзакция Т18 выполняет блокировку для записи элемента данных baly Когда в момент времени t6 транзакция T17

запрашивает блокировку для записи элемента данных baly, она переводится в состояние ожидания, поскольку этот элемент данных уже заблокирован транзакцией T18. В момент времени t7 транзакция T18 , в свою очередь, запрашивает блокировку для записи элемента данных balx и также переводится в состояние ожидания, поскольку этот элемент оказывается заблокированным транзакцией Т17. Ни одна из транзакций не в состоянии продолжить свою работу, поскольку каждая ожидает завершения

работы другой. Если в системе возникает состояние взаимной блокировки,

вовлеченные в него приложения не смогут разрешить данную проблему собственными силами. Ответственность за обнаружение взаимных блокировок и выхода тем или иным образом из этой тупиковой ситуации должна быть возложена на СУБД.

Пример взаимной блокировки двух транзакций

К сожалению, существует только один способ нарушить состояние взаимной блокировки - выполнение одной или более транзакций должно быть отменено. Подобное действие будет сопровождаться откатом всех изменений, внесенных отмененными транзакциями. Для приведенного в таблицу примера можно, скажем, отменить выполнение транзакции Т18. Как только ее откат будет завершен, все установленные этой транзакцией блокировки будут отменены и транзакция Т17 сможет продолжить свое выполнение. Ситуация взаимной блокировки должна быть абсолютно

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

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

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

31.(????) Управление блокировками

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

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

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

В отношении уровня устанавливаемого блока будем использовать общий термин "элемент данных". Ниже представлены основные правила метода блокировки.

Блокировка для чтения

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

Блокировка для записи

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

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

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

• Если элемент еще не заблокирован какой-либо иной транзакцией, блокировка элемента будет выполнена успешно.

• Если элемент данных в настоящий момент уже заблокирован, СУБД проанализирует, является ли тип полученного запроса совместимым с типом уже существующего блока. Если запрашивается доступ для чтения к элементу, который заблокирован для чтения, доступ к элементу данных будет разрешен. В противном случае транзакция будет переведена в состояние ожидания, которое будет продолжаться до тех пор, пока существующий блок не будет снят.

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

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

разрешается устанавливать блокировку элемента данных для записи, с после·

дующим сужением ее до уровня блокировки для чтения.