Главная » SQL, Базы данных » Транзакции  ПОДДЕРЖКА ЯЗЫКА SQL

0

В этом разделе средства поддержки работы с транзакциями в языке SQL (в частности, процедуры восстановления  на основе транзакций) рассматриваются  в  соответствии  с общими принципами, описанными в предыдущих разделах. Прежде всего, в системе гарантируется,  что  выполнение  большинства  операторов  SQL  происходит  неразрывно (единственными исключениями являются CALL и RETURN). Кроме того, как было описано в главе 4, в языке SQL предусмотрены непосредственные аналоги операторов BEGIN TRANSACTION, COMMIT и ROLLBACK, которые называются в нем, соответственно, START TRANSACTION, COMMIT WORK и ROLLBACK WORK. Ниже показан синтаксис оператора START TRANSACTION.

START TRANSACTION <option commalist> ;

Здесь параметр <option commalist>, как показано ниже, определяет режим доступа, уровень изоляции или то и другое (описание четвертого варианта, который касается определения размера диагностической области, выходит за рамки данной книги).

■     Режим доступа может обозначаться ключевым словом READ   ONLY или READ WRITE. Если ни одно из них не указано, то по умолчанию применяется ключевое слово READ   WRITE (при условии, что не определен уровень изоляции READ UNCOMMITTED, так как в этом случае по умолчанию применяется READ  ONLY). Если задано ключевое слово READ WRITE, то уровень изоляции не должен прини мать значение READ UNCOMMITTED.

■     Определение уровня изоляции принимает форму ISOLATION LEVEL <isolation>, где параметр <isolation> может иметь значение READ   UNCOMMITTED, READ COMMITTED, REPEATABLE READ или SERIALIZABLE. Дополнительная информа ция по этой теме приведена в главе 16.

Синтаксис операторов COMMIT и ROLLBACK приведен ниже.

COMMIT [ WORK ] [ AND [ NO ] CHAIN ]

; ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ] ;

Ключевое слово WORK является необязательным. Применение ключевого слова AND CHAIN обеспечивает автоматическое выполнение оператора START TRANSACTION после вызова оператора COMMIT (С таким же параметром <option commalist>, как и у предыдущего оператора START TRANSACTION); ключевое  слово AND NO CHAIN задано по умолчанию. Оператор CLOSE выполняется автоматически для каждого открытого курсора (что приводит к потере позиционирования всех курсоров в базе данных), за исключением курсоров, объявленных с ключевым словом WITH HOLD (ЭТО ОТНОСИТСЯ ТОЛЬКО К оператору COMMIT).

Примечание. Хотя об этом не было сказано в главе 4, ключевое слово WITH HOLD является одной из опций в объявлении курсора. Курсор, объявленный как WITH HOLD, не закрывается автоматически после выполнения оператора COMMIT, а остается открытым и имеет такое позиционирование, что следующий оператор  FETCH переведет его на следующую по порядку строку. Благодаря этому исключается необходимость разрабатывать сложный код повторного позиционирования курсора, который бы в противном случае потребовался в следующем операторе OPEN.

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

SAVEPOINT  <savepoint  name>   ;

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

ROLLBACK TO oavepoint name>   ;

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

RELEASE  <savepoint  name>   ;

Все точки сохранения уничтожаются автоматически после завершения транзакции.

15.4.     РЕЗЮМЕ

В этой главе кратко представлена необходимая информация об управлении транзакциями.   Транзакция   —   это   логическая   единица   работы,   а    также   единица восстановления (кроме того, единица параллельности; подробности приводятся в главе 16).    Транзакции    обладают    такими    свойствами    ACID,    как    неразрывность, правильность     (которое     в     литературе     чаще     называется     совместимостью), изолированность   и   устойчивость.   Управление   транзакциями   предусматривает решение задачи организации их выполнения таким образом, чтобы соблюдение всех этих важнейших свойств абсолютно гарантировалось (за исключением правильности). Проще говоря,  общая  цель  функционирования  всей  системы  может  быть   определена  как надежное выполнение транзакций.

Транзакции  начинаются  с  операции  BEGIN  TRANSACTION  и  оканчиваются  после выполнения операции COMMIT (в случае успешного завершения) или ROLLBACK (В случае

неудачного завершения). Оператор COMMIT устанавливает точку фиксации (при этом обновления записываются в базу данных). Выполнение оператора ROLLBACK возвращает базу данных в предыдущую точку фиксации (все  внесенные обновления отменяются).

Если транзакция не достигает запланированного  завершения, система  автоматически выполняет для нее операцию ROLLBACK (восстановление  транзакции). Для получения возможности отмены (отката) и повторного применения (наката) обновлений в системе

ведется журнал восстановления. Важно отметить, что все записи регистрации хода выполнения некоторой транзакции должны быть физически занесены в журнал до выполнения для этой транзакции операции COMMIT (правило опережающей записи в журнал).

Если происходит аварийный останов системы, то после перезапуска система должна, во-первых, повторно внести все изменения, выполненные в транзакциях, успешно завершенных до этого останова, и во-вторых, отменить все обновления, сделанные в транзакциях, которые начали выполняться, но не были завершены  до останова. Необходимо гарантировать сохранение свойств ACID транзакций даже в случае сбоя системы. Эти операции по восстановлению системы осуществляются в составе процедуры перезапуска системы (которая иначе называется процедурой перезапуска/восстановления). Анализируя последнюю имеющуюся в журнале запись контрольной точки, система определяет, какую работу необходимо выполнить повторно, а какую отменить. Записи контрольной точки заносятся в журнал через установленное время.

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

Системы, позволяющие транзакциям взаимодействовать с двумя (или  несколькими)

различными диспетчерами ресурсов (например, с двумя разными СУБД или с  СУБД и диспетчером передачи данных), должны использовать протокол, называемый протоколом

двухфазной фиксации (или какую-то версию этого протокола), для того, чтобы эти системы поддерживали свойство неразрывности транзакций. Две фазы этого протокола включают, во-первых, фазу подготовки, в которой координатор дает указание всем участникам

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

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

И еще одно, последнее замечание. В принципе, в данной главе речь идет о среде прикладного программирования. Тем не менее, все описанные концепции  применимы  и к пользовательской среде (хотя на этом уровне они могут быть в большей степени скрытыми). Например, программные продукты SQL обычно позволяют пользователю  вводить операторы SQL интерактивно, с терминала. Обычно каждый такой оператор SQL, введенный в интерактивном режиме, обрабатывается как отдельная транзакция — по умолчанию система будет автоматически выполнять операцию COMMIT от имени пользователя сразу после успешного выполнения заданного оператора  SQL (или же оператор

ROLLBACK, если выполнение оканчивается неудачей). Но в некоторых системах пользователи могут запрещать такие автоматические операторы COMMIT И вместо этого выполнять целый ряд операторов SQL (за которыми следует явно заданный оператор COMMIT или ROLLBACK) как единую транзакцию. Но такая практика обычно не рекомендуется, так как в подобном случае часть базы данных может быть заблокирована и на длительное время стать недоступной для других пользователей (глава 16). Более того, в такой операционной среде для конечных пользователей возможно возникновение ситуации взаимной блокировки, что является еще одним доводом в пользу отказа от подобного режима работы (подробные сведения приведены в главе 16).

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии