- •Транзакции и целостность базы данных, параллелизм
- •Транзакции
- •4 Свойства транзакций:
- •Восстановление
- •Шаги восстановления:
- •Рассмотрим описанные выше проблемы с учетом применения механизмов блокировки:
- •Проблема несовместного анализа.
- •Чередующееся выполнение транзакций является верным, если оно эквивалентно некоторому последовательному выполнению, то есть оно подлежит упорядочению.
4 Свойства транзакций:
Атомарность. Транзакции атомарны (выполняется все или ничего).
Согласованность. Транзакции защищают базу данных согласованно. Это означает, что транзакции переводят одно согласованное состояние базы данных в другое без обязательной поддержки согласованности во всех промежуточных точках.
Изоляция. Транзакции отделены одна от другой. Это означает, что, если даже будет запущено множество конкурирующих друг с другом транзакций, любое обновление определенной транзакции будет скрыто от остальных до тех пор, пока эта транзакция выполняется.
Долговечность. Когда транзакция выполнена, ее обновления сохраняются, даже если в следующий момент произойдет сбой системы.
Восстановление
Система должна быть готова к восстановлению не только после небольших локальных нарушений, таких как невыполнение операции в пределах определенной транзакции, но также и после глобальных нарушений типа сбоев в питании центрального процессорного устройства. Местное нарушение по определению поражает только транзакцию, в которой оно собственно и произошло. Глобальное нарушение поражает сразу все транзакции и, следовательно, приводит к значительным для системы последствиям.
Существует два вида глобальных нарушений.
Отказы системы (поражают все выполняющиеся в данный момент транзакции, но физически не нарушают базу данных в целом) – аварийным отказом программного обеспечения.
Отказы носителей (поломка головок дискового накопителя) – аварийный отказ аппаратуры.
Следствие содержимого ОЗУ. Поскольку точное состояние выполняющейся транзакции неизвестно, то транзакция может не завершиться успешно и будет отменена при перезагрузке. Может потребоваться повторное выполнение транзакции, если нет физических обновлений этой транзакции.
В некотором предписанном интервале (когда в журнале накапливается определенное число записей) система автоматически принимает контрольную точку. Принятие контрольной точки включает физическую запись содержимого рабочих буферов базы данных непосредственно в базу данных и специальную физическую запись контрольной точки (список всех осуществляемых в данный момент транзакций).
Очевидно, что до перезагрузки системы Т3 и Т5 должны быть отменены. А Т2 и Т4 выполнены повторно. Т1 не включается в момент перезагрузки, т.к была выполнена до tc. Так же не включаются транзакции неудачные и отменённые перед tf. Во время перезагрузки система идентифицирует все транзакции от Т2 до Т5.
Шаги восстановления:
Создается два списка транзакций: UNDO и REDO. В список UNDO заносятся все транзакции, предоставленные из записи контрольной точки, т.е. все транзакции, выполняющиеся в момент времени tc. Список REDO остается пустым;
Осуществляется поиск в файле регистрации (журнале), начиная с записи контрольной точки;
Если в файле регистрации обнаружена запись BEGIN TRANSACTION о начале транзакции, то эта транзакция также добавляется в список UNDO;
Если в файле регистрации обнаружена запись COMMIT об окончании транзакции, то эта транзакция добавляется в список REDO;
Когда достигается конец файла регистрации, списки UNDO и REDO анализируются для идентификации транзакций типа Т2 и Т4, появившихся в списке REDO, и транзакций типа ТЗ и Т5, оставшихся в списке UNDO;
Транзакции в REDO удаляются из списка UNDO.
После этого система просматривает назад файл регистрации, отменяя транзакции из UNDO, а затем просматривает снова вперед, повторно выполняя транзакции из REDO.
Обратное восстановление – восстановление базы данных в правильное состояние путем отмены выполненных операций.
Прямое восстановление – восстановление ее в правильное состояние повторным выполнением.
Параллелизм.
Параллелизм означает возможность одновременной обработки СУБД нескольких транзакций с доступом к одним и тем же данным в один и тот же момент времени.
В этом случае при обработке правильно составленных транзакций может возникнуть ситуации, которые могут привести к неправильным результатам из-за взаимных помех.
Основные проблемы при параллельной обработке транзакции:
Проблема результатов обновления транзакции
Транзакция A извлекает некий кортеж P в момент времени t1. Транзакция B извлекает некий кортеж P в момент времени t2.
Транзакция A обновляет некий кортеж P (на основе значений полученных в момент времени t1) в момент времени t3. Транзакция B обновляет тот же кортеж P (на основе значений полученных в момент времени t2) в момент времени t4.
Результат операции обновления A будет утерян, поскольку в момент времени t4, она не будет учтена, и потому будет отменена операцией обновления выполнения транзакции B.
Проблема незафиксированной зависимости
Эта проблема появляется, если с транзакцией B осуществляется извлечение (a) или что еще хуже обновление (b) некоторого кортежа, который в данный момент обрабатывает A, но это обновление еще не закончено.
Таким образом, если обновление не завершено, существует некоторая вероятность того, что оно не будет завершено никогда. В таком случае в первой транзакции будут принимать участие данные, которые не существуют.
Рис. a. Транзакция B в t2 встречается с невыполненным обновлением кортежа P, предположим, что это обновление меняется в момент времени t3. В результате B выполняется на основании фальшивого предположения, что кортеж P имеет значение в t2, хотя на самом деле значение в t1. В итоге выполнения транзакции B был получен неверный результат.
Рис. b. Транзакция B выполняет невыполнимое изменение, и результат обновления утрачивается в момент времени t3, поскольку результат отмены A в t3 приводит восстановление P к исходному значению в момент t1.
Проблема несовместимого анализа
Транзакции A и B выполняются для кортежей N1, N2, N3. Транзакция A вычисляет итоговый баланс, транзакция B производит перевод суммы, равной 10, со счета N3 на счет N1.
Из-за взаимных помех транзакций получен неверный результат. В этом случае A встретилась со несовместимым состоянием и на его основании был выполнен несовместимый анализ.
Блокировка.
Описанные выше проблемы могут быть решены с помощью методики управления параллельным выполнением процесса под названием блокировка.
Основная идея блокировки: Случай, когда для выполнения некоторой транзакции необходимо чтобы некоторый объект (обычно это кортеж БД) не изменялся непредсказуемо и без ведомо этой транзакции, такой объект блокируется.
Алгоритм блокировки:
Предположим, что в системе поддерживается два типа блокировок
Блокировка без взаимного доступа (монопольная или X - блокировка)
Блокировка с взаимным доступом (S - блокировка)
Если транзакция A блокирует кортеж P X – блокировкой, то запрос другой транзакции B с блокировкой кортежа будет отменен.
Если транзакция A блокирует кортеж P S – блокировкой, то:
Запрос транзакции B на X – блокировку будет отвергнут
Запрос транзакции B на S – блокировку будет принят
Протокол доступа к данным.
Введем протокол доступа к данным, который позволит избежать указанных ранее проблем параллелизма.
Транзакция, предназначенная для извлечения кортежа, прежде всего, должна наложить S – блокировку на этот кортеж.
Транзакция, предназначенная для обновления кортежа должна наложить X – блокировку на этот кортеж.
При этом если для этого кортежа задана S – блокировка, ее необходимо заменить X – блокировкой.
Если запрашиваемая блокировка, со стороны транзакции B, отвергается из-за конфликта с другой блокировкой со стороны A, то транзакция B переходит в состояние ожидания, и будет находиться в нем пока не будет снята блокировка со стороны A.
В системе должны быть предусмотрены способы бесконечно долгого ожидания.
Все блокировки сохраняются вплоть до конца выполнения транзакции (COMMIT, ROUBACK)