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

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

Типы транзакций:

  1. Плоские (классические)
  2. Цепочечные
  3. Вложенные

Плоские:

Характеризуются четырьмя классическими свойствами.

  1. Атомарность (Atomicity)
  2. Согласованность (Consistency)
  3. Изолированность (Isolation)
  4. Долговечность (Durability)

Атомарность (Atomacity) выражается в том, что транзакция должна быть выполнена в целом или не выполнена вовсе.

Согласованность (Consistency) гарантирует, что по мере выполнения транзакций, данные переходят из одного согласованного состояния в другое. Транзакции не разрушает взаимной согласованности данных.

Изолированность (Isolation) гарантирует, что конкурирующие за доступ к базе данных транзакции физически обрабатываются последовательно изолированно друг от друга, но для пользователя выглядят так, как будто выполняются параллельно.

Долговечность (Durability): если транзакция завершена успешно, то те изменения в данных, которые были произведены, не могут быть потеряны ни при каких обстоятельствах, даже в случае последующих ошибок.

Возможны 2 варианта завершения транзакции:

  1. Фиксация – действие, обеспечивающее запись на диск изменений в базе данных, которые были сделаны в процессе выполнения транзакции. Это значит, что результаты выполнения транзакции станут видимы другим пользователям.
  2. Откат – действие, обеспечивающее аннулирование всех изменений данных, которые были сделаны операторами SQL в теле текущей незавершенной транзакции.

Модель транзакции(рисунок):

Транзакция начинается с первого SQL оператора. Последующие составляют тело транзакции. Commit выполняется в случае успешного завершения обработки информации, объединенной в транзакцию. Его выполнение фиксирует изменения, внесенные в базу данных текущей транзакции. Roilback прерывает выполнение транзакции и осуществляет отмену изменений, проведенных в ходе выполнения транзакции.

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

Общие принципы восстановления

Результаты зафиксированных транзакций должны быть сохранены в восстановленном состоянии базы данных. Результаты незафиксированных транзакций должны отсутствовать в восстановленном состоянии базы данных.

Восстановление возможно при:

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

· аварийное завершение работы

· стандартная ситуация отката транзакции

· принудительный откат транзакции

· в случае взаимной блокировки при параллельном выполнении транзакции

  1. мягкий сбой

Восстановление после внезапной потери содержания оперативной памяти. В случае:

    • аварийное отключение электропитания
    • возникновения неустранимого сбоя процессора
  1. жесткий сбой. Восстановление после поломки основного внешнего носителя базы данных.

Основа восстановления – архивная копия и журнал изменений базы данных.

В основе избыточное хранение данных.

2 вида ведения журнала:

1. для каждой транзакции поддерживается отдельный журнал изменений – локальный журнал

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

Общая структура журнала может быть представлена в виде последовательного файла. Каждая запись помечается номером транзакции, к которой она относится и значением атрибутов, которые она меняет. Фиксируется команда начала и завершения транзакции. Журнал транзакций дублируется системными средствами СУБД.

Используют 2 варианта ведения журнала

  1. протокол с отмеченными изменениями
  2. протокол с немедленными изменениями

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

1. пользователь видит только согласованные данные

2. СУБД гарантировано поддерживает принцип независимого выполнения транзакций – сериализация транзакций.

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

В ряде СУБД организована блокировка на уровне страниц.

Блокировки, называемые синхронизационными захватами объектов, могут быть применимы к разным типам, в том числе и по всей базе данных.

Для повышения эффективности параллельного использования транзакций, используются комбинирования разных типов синхронизационных захватов.

Рассматриваются 2 основных типа:

  1. Совместный режим блокировки – нежесткая или разделяемая блокировка (S, Shared). Это означает разделяемый захват объекта. Объекты не изменяются в процессе выполнения транзакций и доступны другим только для чтения.
  2. Монопольный режим – жесткая или эксклюзивная блокировка (X, Exclusive). Требуется для выполнения операций занесения, удаления, модификации и предполагает монопольный захват объекта. Объекты недоступны для других транзакций.

Правила совместимости захвата одного объекта другим

  Транзакция B  
Разблокирована Нежесткая Жесткая
Транзакция А Разблокирована Да Да Да  
Нежесткая Да Да Нет  
жесткая Да Нет Нет  
             

Предполагается, что первой блокирует объект транзакция А, потом пытается получить транзакция B. Нескольким транзакциям допускается читать один и тот же объект. Захват объекта одной транзакцией по чтению не совместим с захватом другой транзакции того же объекта по записи. Захваты одного объекта разными транзакциями по записи несовместимы. Применение разных типов блокировок приводит к проблеме тупиков. Количество взаимно заблокированных транзакций может быть большим. Эту ситуацию каждая из транзакций самостоятельно обнаружить не может. Ее должна разрешить СУБД. Основой обнаружения тупиковых ситуаций является построение графа ожидания транзакции. Разрушение тупика начинается с выбора в цикле транзакций, так называемой транзакции-жертвы, т.е. транзакции, которой разрешено пожертвовать ради обеспечения возможности выполнения другой транзакции.

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


Наши рекомендации