|
Программирование >> Хронологические базы данных
Теперь, что бы ни случилось, менеджер ресурсов будет иметь постоянную запись о работе, выполненной им в процессе обработки данной транзакции, а значит, в случае необходимости сможет зафиксировать выполненные обновления или отменить их. Если принудительная разгрузка прошла успешно, менеджер ресурсов отвечает координатору, что все ОК . В противном случае он посылает противоположное сообщение - Not OK . 2. Вторая фаза наступает после того, как координатор получит соответствующие ответы от всех участников. Сначала он принудительно выгружает записи о завершаемой транзакции в собственный физический журнал регистрации, фиксируя свое решение относительно этой транзакции. Если все поступившие ответы были ОК , то координатор принимает решение глобально зафиксировать данную транзакцию. Если же поступил хотя бы один ответ Not ОК , то для транзакции будет выполнен глобальный откат. Затем координатор каким-либо способом информирует каждого из участников транзакции о своем решении и каждый участник согласно поступившей инструкции должен или локально зафиксировать транзакцию, или выполнить ее откат. Обратите внимание, что каждый участник должен делать то, что ему велел координатор в ходе выполнения второй фазы; в этом и состоит суть данного протокола. Обратите также внимание, что именно появление записи этого решения в физическом журнале регистрации координатора и отмечает переход от фазы 1 к фазе 2. Теперь, если система дает сбой в какой-либо точке всего этого процесса в целом, процедура перезагрузки будет искать запись о принятом решении в журнале регистрации координатора. Если она будет обнаружена, то можно будет установить, какое решение было принято до остановки, и продолжить обработку. Если подобная запись не будет обнаружена, будет принято решение об откате данной транзакции и, следовательно, процесс так или иначе завершится. Замечание. Стоит подчеркнуть, что если координатор и участники выполняют свою работу на различных компьютерах, что типично для распределенной системы (глава 20), то ошибка в работе координатора может привести к тому, что некий участник достаточно долго будет ожидать поступления сведений о принятом координатором решении. В течение всего времени ожидания любое из обновлений, произведенное транзакцией в базе данных этого участника, должно быть скрыто от других транзакций (иначе говоря, эти обновления должны быть заблокированы, о чем речь пойдет в следующей главе). Отметим, что менеджер передачи данных (см. главу 2) также может рассматриваться как менеджер ресурсов в описанном выше смысле. Это означает, что сообщения можно считать такими же восстанавливаемыми ресурсами, как и саму базу данных, а менеджер передачи данных должен быть способен участвовать в процессе двухфазной фиксации. Для дальнейшего изучения этого вопроса, а также общей идеи двухфазной фиксации обратитесь к [14.12]. 14.7. Поддержка языка SQL В этом разделе кратко рассматриваются средства поддержки работы с транзакциями в языке SQL и, в частности, процедур восстановления на основе транзакций. Прежде всего, в языке SQL поддерживаются обычные операции COMMIT и ROLLBACK (с необязательным допол- нительным ключевым словом WORK в обоих случаях, описанным выше, в главе 4). Для каждого открытого курсора эти операщ1и принудительно выполняют операш1Ю CLOSE (закрыть), что вызывает потерю всей имевшейся информащ1И о позиционировании базы данных. Замечание. В некоторых версиях языка SQL предусмотрена возможность защиты от автоматического выполнения операции CLOSE (для операции COMMIT, но не для ROLLBACK) и вызванной этим потери информации о позиционировании. Например, в СУБД DB2 при объявлении курсора допускается использование опции WITH HOLD. В результате при выполнении операции COMMIT подобный курсор не закрывается, а остается открытым и позиционированным таким образом, что выполнение очередной команды FENCH вызовет перемещение к следующей строке последовательности. В данном случае при выполнении следующей операции OPEN не потребуется вновь обрабатывать код (возможно, очень сложный), предназначенный для восстановления утраченной информации о позиционировании. Такая возможность в настоящее время включена в версию стандарта SQL3 (см. приложение Б). Важное различие между способом поддержки средств работы с транзакциями в языке SQL и общими концепциями, обсуждавшимися в этой главе, состоит в том, что язык SQL не имеет никакого явного оператора BEGIN TRANSACTION. Вместо этого транзакция неявно начинается всякий раз, когда программа выполняет операцию инициализации транзакции при условии отсутствия уже выполняющейся транзакции. (Подобно описанной выше возможности сохранения информации о позиционировании, вполне вероятно, что поддержка явной операции BEGIN TRANSACTION станет в языке SQL стандартной. В настоящее время она включена в состав версии стандарта SQL3.) Подробное описание операций инициализации транзакции здесь не приводится; достаточно сказать, что операции определения данных и манипулирования ими, обсуждавшиеся в предыдущих главах, относятся к операциям инициализации, а операции COMMIT и ROLLBACK, очевидно, нет. Специальный оператор SET TRANSACTION используется для задания характеристик транзакции, которая будет инициализирована. (Оператор SET TRANSACTION может выполняться только тогда, когда не выполняются никакие транзакции, и сам по себе он не является инициализирующим транзакцию оператором.) Здесь мы обсудим только две из существующих характеристик: режим доступа и уровень изоляции. Ниже показан общий синтаксис этого оператора. SET TRANSACTION <список опцийО ; Здесь параметр <список опций> включает режим доступа, уровень изоляции или и то, и другое. Режим доступа может быть либо только для чтения (READ ONLY), либо для чтения и записи (READ WRITE). Если ничего не оговорено, то по умолчанию используется значение READ WRITE. Если оговорен уровень изоляции READ UNCOMMITTED, то по умолчанию используется значение READ ONLY. Если применяется значение READ WRITE, то значение READ UNCOMMITTED не может использоваться при определении уровня изоляции. Уровень изоляции определяется в виде ISOLATION LEVEL <изоляций>, где параметр изоляция может иметь одно из следующих значений: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ или SERIALIZABLE. Более подробные пояснения приведены в главе 15. 14.8. Резюме в этой главе кратко представлена необходимая информация об обработке транзакций. Транзакция - это логическая единица работы, а также единица восстановления (кроме того, единица параллельности и целостности; подробности приводятся в главах 15 и 8 соответственно). Транзакции обладают ACID-свойствами - атомарностью, согласованностью, изолированностью и долговечностью. Управление транзакциями предусматривает решение задачи организации их выполнения таким образом, чтобы соблюдение всех этих важнейших свойств абсолютно гарантировалось. Проще говоря, общая цель функционирования всей системы может быть определена как надежное выполнение потока транзакции. Транзакции инициируются операцией BEGIN TRANSACTION и завершаются операцией COMMIT (в случае успешного завершения) либо ROLLBACK (в случае неудачного завершения). Оператор COMMIT устанавливает точку фиксации (при этом обновления становятся постоянными). Выполнение оператора ROLLBACK возвращает базу данных в предыдущую точку фиксации (все внесенные изменения отменяются). Если транзакция не достигает запланированного завершения, система принудительно выполняет для нее операцию ROLLBACK (восстановление транзакции). Для получения возможности отмены (или повторного внесения) выполненных обновлений система поддерживает журнал регистрации транзакций. Важно отметить, что все записи регистрации хода выполнения некоторой транзакции должны быть физически занесены в журнал до выполнения для этой транзакции операции COMMIT (правило предварительной записи в журнал). Кроме того, необходимо гарантировать сохранение АСШ-свойств транзакций даже в случае сбоя системы. Для обеспечения такой гарантии система должна: а) повторно выполнить всю работу, выполненную транзакциями, которые успешно завершились до момента отказа; б) отменить всю работу, выполненную транзакциями, которые начались, но не закончились до момента сбоя. Восстановление системы осуществляется как часть процедуры перезагрузки (которая иначе называется процедурой перезагрузки/восстановления). Анализируя последнюю имеющуюся в журнале запись контрольной точки, система определяет, какую работу необходимо выполнить повторно, а какую отменить. Записи контрольной точки заносятся в журнал через установленное время. Система также обеспечивает восстановление носителей, что реализуется путем восстановления базы данных с заранее созданной резервной копии (дампа) с последующим использованием журнала для повторного выполнения всей работы, проведенной в базе данных после создания данной резервной копии. Для поддержки функции восстановления носителей используются утилиты восстановления с резервной копии. Системы, позволяющие транзакциям взаимодействовать с двумя (или более) различными менеджерами ресурсов (например, с двумя разными СУБД или СУБД и менеджером передачи данных), должны использовать протокол, называемый протоколом двухфазной фиксации, который обеспечивает обязательное соблюдение свойства атомарности транзакции. Две фазы этого протокола включают: а) подготовительную фазу, в которой координатор дает указание всем участникам быть готовыми действовать одним из возможных способов ; б) фазу фиксации, в которой координатор (после того как все участники дали ожидаемый от них ответ во время
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.438
При копировании материалов приветствуются ссылки. |