Ни для кого не секрет, что существует такие большие и сложные операции, выполняющиеся в течение нескольких шагов, которые должны либо быть выполнены полностью, либо не должны быть выполнены вообще [2]. Такая сложная логическая единица работы получила название транзакции. Наиболее ярким примером транзакции является банковская операция по переводу денег с одного счета на другой. Такая транзакция выполняется в течение нескольких шагов: сначала деньги списываются со счета отправителя и только потом зачисляются на счет получателя. Так, если данная транзакция прервется после первого шага и не будет предпринято никаких мер, то отправитель просто потеряет свои деньги, которые не дойдут до получателя. Именно для того, чтобы избежать подобных ситуаций, и был разработан механизм управления транзакциями, предохраняющий данные от утраты и повреждения.
Существуют две основные причины из-за которых возможны утрата или повреждение данных [1]:
1) Аварийный сбой системы, в результате которого база данных может оказаться в неопределенном состоянии (рассмотренный выше пример о банковской транзакции относится к данному случаю);
2) Конфликт нескольких программ при одновременном обращении к одним и тем же данным (например, программа А начала свою работу и запросила некоторые данные, которые также запросила и программа Б; отработав, программа А изменила данные; то же самое сделала и программа Б; однако после последнего изменения данные стали неверными, так как программа Б обрабатывала исходные данные, а не те, что были получены после работы программы А).
За устранение первой возможной причины утраты или повреждения данных отвечает такой аспект управления транзакциями, как восстановление (или управление восстановлением), а устранение второй — параллельность (или управление параллельностью). Далее в данной работе каждый из указанных аспектов управления транзакциями будет рассмотрен более подробно.
Под восстановлением [1] понимается возвращение базы данных в то самое «правильное» состояние, в котором она находилась до сбоя системы. Например, в рассмотренном варианте с банковской транзакцией база данных и система будут восстановлены таким образом, что средства вернутся на счет отправителя. Между тем, необходимо отметить, что восстановлению подлежат транзакции, система и носители. При этом для каждого вида восстановления характерны свои отличительные черты.
В первую очередь, необходимо рассмотреть транзакции. Как было сказано выше, транзакция является неразрывной логической единицей работы. Поддерживает же такую неразрывность диспетчер транзакций, работу которого организуют оператор фиксации (сигнализирует об успешном окончании транзакции) и оператор отката (сигнализирует о неудачном окончании транзакции). При фиксации диспетчер транзакций понимает, что транзакция выполнена успешно, а база данных находится в непротиворечивом состоянии. При откате же, наоборот, диспетчер транзакций понимает, что транзакция не выполнена, база данных находится в противоречивом состоянии и что необходимо отменить все действия, совершенные при выполнении данной транзакции. Таким образом, в каждой точке фиксации база данных находится в непротиворечивом состоянии. Поэтому транзакции также являются единицами восстановления системы. Также необходимо отметить момент, что возможна ситуация, когда транзакция выполнена успешно, но ее результаты не занесены в базу данных. Подобную транзакцию при сбое необходимо будет выполнить еще один раз.
Но сбой в работе одной транзакции является частным случаем. Куда более распространенной ситуацией является отказ системы, который может произойти, например, при сбое в сети электропитания. Подобный отказ системы влияет на все транзакции, выполнение которых проходило в момент отказа. Однако данный отказ не приводит к физическому повреждению базы данных. Тем не менее, при перезапуске системы после сбоя встает важный вопрос — какие транзакции необходимо отменить, а какие необходимо выполнить повторно? Ответить на данный вопрос помогают автоматически создаваемые контрольные точки, информация о которых записывается на физический носитель. При создании контрольной точки записывается информация обо всех транзакциях, которые выполняются в момент создания. Так при перезапуске системы после сбоя все транзакции, выполненные до создания контрольной точки, не участвуют в перезапуске; транзакции, успешно выполненные до отказа системы, запускаются повторно, а транзакции, не выполненные успешно до отказа системы, отменяются.
Также нельзя не упомянуть про отказ физических носителей, который повлияет как минимум на те транзакции, которые использовали данные на отказавших носителях. При данном виде отказа восстановление происходит путем загрузки базы данных с резервной копии, а также повторного выполнения успешно выполненных транзакций на основе данных журнала транзакций. Соответственно, отменять какие-либо транзакции нет необходимости, так как информация о них не хранится в журнале и они уже отменены из-за отказа носителей.
Под параллельностью [1] понимается такое свойство системы управления базой данных, которое позволяет нескольким программам (транзакциям) в один и тот же момент обращаться к одной и той же базе данных. Однако для выполнения данного свойства требуется специальный механизм управления, который будет следить за тем, чтобы не происходило каких-либо нарушений в работе. Таких нарушений может быть всего три: проблема потерянного обновления (две транзакции начинают работу с одними и теми же данными, затем первая транзакция обновляет эти данные, после чего то же самое делает и вторая транзакция, из-за чего теряются результаты обновления первой транзакции, так как вторая транзакция в своей работе использовала исходные данные), проблема зависимости от незафиксированных результатов (использование одной транзакцией данных, обновленных другой транзакция, которая еще не выполнена полностью и может быть отменена) и проблема анализа несовместимости (использование одной транзакций нескольких наборов данных, которые были успешно другой транзакцией, причем некоторые значения были использованы первой транзакцией еще до выполнения второй, в связи с чем возникает ошибка несовместимости). Данные проблемы решаются благодаря блокировкам, механизму предотвращения взаимоблокировок и упорядочиваемости.
Используются два вида блокировок: исключительные блокировки записи и разделяемые блокировки чтения. В начале своей работы каждая транзакция запрашивает доступ к определенным данным, и если этот доступ предоставляется, то транзакция получает блокировку на эти данные. Так, если некоторая транзакция владеет исключительной блокировкой записи на некоторый набор данных, то никакая другая транзакция не может получить доступ к этим данным, пока не отработает первая транзакция. Если же некоторая транзакция владеет разделяемой блокировкой чтения на некоторый набор данных, то никакая другая транзакция не может получить исключительную блокировку записи на эти данные, однако любая другая транзакция может получить разделяемую блокировку чтения на этот набор данных. Данные блокировки решают все три возможных вида нарушения работы системы управления базой данных при параллельной работы транзакций. Однако они могут породить некоторые другие проблемы, ключевой из которых является проблема взаимоблокировки.
Взаимоблокировка [1] возникает, когда несколько транзакций одновременно находятся в состоянии ожидания, причем каждая из них ждет, пока одна из остальных завершит свою работу. Существует два основных подхода к предотвращению взаимоблокировок: модификация протокола блокировки, чтобы полностью избежать взаимоблокировки, либо устранение взаимоблокировок после их возникновения. Второй вариант является наиболее распространенным, однако более правилен первый.
Еще одним немаловажным фактором, обеспечивающем выполнение параллельной работы транзакций, является критерий упорядочиваемости, согласно которому согласуется выполнение множества транзакций на основе определенных правил.
В заключение хотелось бы еще раз отметить, что восстановление и параллельность, или управление восстановление и управление параллельностью, являются двумя важнейшими аспектами управления транзакциями, логическими единицами работы, без которых представить работу базы данных и СУБД на сегодняшний день невозможно.
Литература:
- Дейт, К.Дж. Введение в системы баз данных, 8-е издание.: Пер. с англ. / К.Дж. Дейт. — М.: Издательский дом «Вильямс», 2008. — 1328 с.: ил. — Парал. тит. англ.
- Зеленков, Ю. А. Введение в базы данных. // Электронный ресурс. URL: http://www.mstu.edu.ru/study/materials/zelenkov/toc.html (дата обращения: 10.09.2016).