Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций БД.rtf
Скачиваний:
56
Добавлен:
10.07.2019
Размер:
4 Мб
Скачать
☆
      1. Проблема несовместимого анализа

На Error: Reference source not found приведена измененная версия отношения (Error: Reference source not found) с перечислением чередующихся транзакций согласно протоколу блокировки. Операция обновления для транзакции B в момент времени t6 не будет выполнена. Дело в том, что она является неявным запросом с заданием Х-блокировки для кортежа СЧЕТ 1, а этот запрос вступает в конфликт с S-блокировкой, уже заданной транзакцией A. Таким образом, транзакция B переходит в состояние ожидания. Точно так же операция извлечения для транзакции A в момент времени t7 не будет выполнена. Дело в том, что она является неявным запросом с заданием S-блокировки для кортежа СЧЕТ 3, а этот запрос вступает в конфликт с Х‑блокировкой, уже заданной транзакцией B. Таким образом, транзакция A переходит в состояние ожидания. Следовательно, блокировка хотя и помогает решить одну проблему (а именно проблему несовместимого анализа), но приводит к необходимости решения другой проблемы (а именно проблемы возникновения тупиковой ситуации).

СЧЕТ 1

40

СЧЕТ 2

50

СЧЕТ 3

30

Транзакция A

Время

Транзакция B

Извлечение кортежа СЧЕТ 1:

(задание S-блокировки для СЧЕТ 1)

СУММА = 40

t1

–

Извлечение кортежа СЧЕТ 1:

(задание S-блокировки для СЧЕТ 2)

СУММА = 90

t2

–

–

t3

Извлечение кортежа СЧЕТ 3:

(задание S-блокировки для СЧЕТ 3)

–

t4

Обновление кортежа СЧЕТ 3:

(задание X-блокировки для СЧЕТ 3)

30 ® 20

–

t5

Извлечение кортежа СЧЕТ 1:

(задание S-блокировки для СЧЕТ 1)

–

t6

Обновление кортежа СЧЕТ 1:

(задание X-блокировки для СЧЕТ 1)

40 ® 50

–

t7

Ожидание

Извлечение кортежа СЧЕТ 3:

(задание S-блокировки для СЧЕТ 3)

t8

Ожидание

Ожидание

Ожидание

рис. 15.75. Проблема несовместимого анализа разрешается, но в момент времени t7 возникает тупиковая ситуация.

    1. Тупиковые ситуации

Как было показано выше, блокировку можно использовать для разрешения трех основных проблем, возникающих при параллельной обработке кортежей. К сожалению, использование блокировок приводит к возникновению другой проблемы – тупиковой ситуации. На Error: Reference source not found показан обобщенный пример этой проблемы, в котором p1 и p2 представляют любые блокируемые объекты, необязательно кортежи базы данных, а выражения типа "блокировка ... без взаимного доступа" представляют любые операции с наложением блокировки без взаимного доступа, заданные как явно, так и неявно.

Транзакция A

Время

Транзакция B

Блокировка р1 без взаимного доступа

t1

–

–

t2

Блокировка р2 без взаимного доступа

Блокировка р2 без взаимного доступа

t3

–

Ожидание

t4

Блокировка р1 без взаимного доступа

Ожидание

Ожидание

рис. 15.76. Пример тупиковой ситуации.

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

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

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

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