|
Программирование >> Программирование баз данных
принципу все или ничего , ведь нельзя, например, допустить, чтобы была удалена только часть строк, указанных в операторе удаления. Поэтому по умолчанию минимальная длина транзакции равна одному оператору. Но иногда возникает необходимость выполнить по принципу все или ничего несколько операторов, например, как в описанной выше банковской операции с переводом денег со счета на счет. Это означает, что должен быть предусмотрен способ обозначена начала и конца транзакции, а также способ регламентации действий, которые должны производиться в случае успешного или неудачного завершения транзакции. Для этого предусмотрено несколько описанных ниже операторов T-SQL, которые позволяют обозначить в транзакции указанные точки. Наиболее важные из них приведены ниже. Оператор BEGIN TRAN [SACTION]. Задает начальную точку транзакции. Оператор COMMIT TI [SACTION]. После выполнения этого оператора результаты осуш;ествления транзакции становятся постоянной, неотъемлемой частью базы данных (это называется фиксацией). Оператор ROLLBACK TRAN [SACTION]. Выполнение этого оператора приводит к полной отмене (откату) изменений, внесенных в базу данных предыду-ш;ими операторами транзакции. Оператор SAVE TRAN [SACTION]. Устанавливает определенную отметку, которая позволяет произвести только частичный откат (такая отметка называется контрольной точкой). Рассмотрим вначале отдельные операторы управления транзакциями, а после этого перейдем к описанию примеров транзакций. Оператор begin tran По-видимому, действие оператора BEGIN TRAN, с которого начинается выполнение транзакции, можно объяснить прош;е всего. Единственное назначение этого оператора состоит в том, что он указывает, где начинается неразрывная единица работы, рассматриваемая как одна транзакция. Если по какой-то причине не удастся зафиксировать транзакцию или сложатся такие условия, при которых фиксация транзакции потеряет смысл, то отменяются все действия, выполненные в базе данных в составе транзакции, и база данных возвраш;ается в то состояние, которое она имела в точке вызова этого оператора (происходит откат). Иными словами, все результаты действий, выполненных в составе транзакции, начиная с этой точки, которые не были в конечном итоге зафиксированы, фактически отменяются (безусловно, только в той части, которая касается самой базы данных). Этот оператор имеет следуюш;ий синтаксис: BEGIN TRAN[SACTION] [<transaction name><®transaction variable>] Оператор commit tran Оператор COMMIT TRAN обеспечивает фиксацию транзакции и тем самым обозначает конец выполнения транзакции. С момента выполнения оператора COMMIT TRAN транзакция, к которой относится этот оператор, переходит в категорию устойчивых. Иными словами, с этого момента результаты выполнения транзакции становятся постоянными и сохраняются даже после аварийного завершения работы системы (но разумеется, это не гарантирует сохранения данных в случае физического уничтожения файлов базы данных, если отсутствует их резервная копия). Единственным способом отмены изменений, внесенных в базу данных в результате выполнения зафиксированной транзакции, является вызов новой транзакции, которая осуществляет действия, обратные по отношению к предыдущей транзакции. Синтаксис оператора COMMIT TRAN во многом напоминает синтаксис оператора BEGIN TRAN: С0Г4М1Т TRAN[SACTION] [<transaction name> <@transaction variable>] Оператор rollback tran Наглядным описанием операции отката, выполняемой с помощью оператора ROLLBACK TRAN, может стать совет, содержащийся в словах песни Начни сначала . Иначе говоря, если что-то не удается успешно довести до конца, то лучше всего отменить сделанное и верьгугься к исходной точке. Обычно на практике такая рекомендация вполне оправдывается. А достичь именно этой цели - вернуться в состояние, которое имело место до начала транзакции, - позволяет оператор ROLLBACK TRAN. Тем не менее происходит отмена только действий, выполненных в транзакции, к которой относится оператор ROLLBACK TRAN. При этом исключаются все изменения, которые произошли в базе данных в результате действий, выполненных в составе транзакции со времени вызова оператора BEGIN TRAN этой транзакции. Но если в ходе осуществления транзакции были установлены так называемые точки сохранения, которые вскоре будут описаны, то отмена вьшолнения происходит до одной из предьщущих точек сохранения. Оператор ROLLBACK TRAN имеет в основном такой же синтаксис, как и другие описанные выше операторы управления транзакциями, не считая того, что в нем предусмотрена также возможность указать точку сохранения: ROLLBACK TRAN[SACTION] [<transaction name><save point name> <@transaction variable><®savepoint variable>] Оператор save tran Промежуточное сохранение результатов транзакции с помощью оператора SAVE TRAN представляет собой создание своего рода вспомогательного объекта, называемого точкой сохранения, который напоминает закладку в недочитанной книге. Точке сохранения присваивается имя, которое позволяет отличить ее от других точек сохранения. После создания точка сохранения может быть указана при выполнении отката. Такая возможность очень удобна, поскольку позволяет точно определить в прикладном коде, к какому состоянию базы данных необходимо вернуться в том случае, если будет обнаружено нарушение в работе. Для этого достаточно лишь указать точку сохранения, к которой должен быть выполнен откат. Оператор SAVE TRAN имеет довольно простой синтаксис: SAVE TRAN[SACTION] [<save point name> <®savepoint variable>] При использовании точек сохранения необходимо учитывать то, что после выполнения оператора ROLLBACK TRAN все они уничтожаются. Это означает, что даже если будет создано пять точек сохранения, то все они исчезают после вьшолнения единственного оператора ROLLBACK TRAN. Безусловно, возможность снова приступить к созданию новых точек сохранения не исключается, так же как остается возможность выполнить откат к новым точкам сохранения, но все точки сохранения, созданные ко времени выполнения последнего оператора ROLLBACK TRAN, уничтожаются. Для тех, кто впервые сталкивается с таким понятием, как точки сохранения, эти объекты базы данных часто становятся источником путаницы. В частности, в документации Books Online указано, что после выполнения отката к точке сохранения необходимо довести транзакцию до логического конца (это утверждение с формальной точки зрения является правильным). А путаница возникает по той причине, что из сказанного в документации Books Online может быть сделан вывод, будто после отката к точке сохранения необходимо переходить к выполнению оператора ROLLBACK или COMMIT, не используя больше точек сохранения. Но дело обстоит иначе, поскольку нельзя использовать лишь точки сохранения, которые были объявлены до оператора ROLLBACK, а точки сохранения, объявленные после этого оператора, являются вполне приемлемыми. Рассмотрим небольшой пример кода для определения того, что происходит при совместном применении операторов TRAN различных типов. Введите следующий код, а затем ознакомьтесь с приведенными ниже пояснениями: USE AdventureWorks -- Рассматривается просто пример создания собственной таблицы, -- поэтому выбор той или иной базы данных не имеет особого -- значения. -- Создание рабочей таблицы CREATE TABLE MyTranTest OrderlD INT PRIMARY KEY IDENTITY -- Запуск транзакции BEGIN TRAN TranStart -- Вставка первого фрагмента данных с использованием заданных по умолчанию -- значений. В следующем операторе осуществляется вставка первой строки. Она -- останется первой даже в случае выполнения последующих операций отката INSERT INTO MyTranTest DEFAULT VALUES -- Создание закладки , к которой можно вернуться в дальнейшем, если потребуется SAVE TRAN FirstPoint -- Вставка некоторых других данных с использованием заданных по умолчанию значений -- (вставленная строка должна исчезнуть после отката). Для этого применяется -- вторая операция вставки INSERT INTO MyTranTest DEFAULT VALUES -- Выполняется откат к первой точке сохранения. Все данные, которые были -- вставлены в таблицу ранее, остаются частью транзакции, а все прочие -- данные исчезают ROLLBACK TRAN FirstPoint -- Вставка некоторого дополнительного объема данных с использованием значений, -- заданных по умолчанию. Соответствующая строка, которая введена в таблицу -- в результате выполнения третьей операции вставки, становится второй строкой -- в таблице и останется в ней после выполнения всех операций отката INSERT INTO MyTranTest DEFAULT VALUES
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |