|
Программирование >> Программирование баз данных
-- Создание еще одной точки сохранения, к которой может быть выполнен откат SAVE TRAN SecondPoint -- Вставка еще некоторых данных. Эти данные также будут уничтожены, но на этот -- раз только после выполнения второй операции отката. Соответствующая операция -- вставки является четвертой по очереди INSERT INTO MyTranTest DEFAULT VALUES -- Возврат ко второй точке сохранения ROLLBACK TRAN SecondPoint -- Вставка некоторых других данных в целях проведения дальнейших экспериментов. -- Для этого применяется пятая по очереди операция вставки, а вставленная строка -- становится в таблице третьей и остается в ней после выполнения всех операций -- отката INSERT INTO MyTranTest DEFAULT VALUES -- Фиксация транзакции COMMIT TRAN TranStart -- Определение того, какие строки остались в таблице ко времени окончательной -- фиксации SELECT TOP 3 OrderlD FROM MyTranTest ORDER BY OrderlD DESC -- Удаление ненужной таблицы DROP TABLE MyTranTest Вначале создадим таблицу, предназначенную для использования с этим тестовым сценарием: -- Создание рабочей таблицы CREATE TABLE MyTranTest ( OrderlD INT PRIMARY KEY IDENTITY В данном случае для проведения экспериментов создается отдельная таблица, поэтому не имеет значения, какая база данных будет использоваться в текущей демонстрации. Приступим к выполнению транзакции. С нее начинается группирование операторов по принципу все или ничего . После этого выполним вставку строки с помощью оператора INSERT. В данный момент выполнена вставка только одной строки: -- Запуск транзакции BEGIN TRAN TranStart -- Вставка первого фрагмента данных с использованием заданных по умолчанию значений. В следующем операторе осуществляется вставка первой записи. -- Она останется первой даже в случае выполнения последующих операций отката INSERT INTO MyTranTest DEFAULT VALUES После вставки строки быяа определена точка сохранения FirstPoint и вставлена еще одна строка. К этому моменту в таблицу вставлены две строки, но напомним, что эти строки еще не зафиксированы, поэтому в базе данных пока что нет информации о том, что они действительно входят в состав базы данных: -- Создание закладки , к которой можно вернуться в дальнейшем, если потребуется SAVE TRAN FirstPoint -- Вставка некоторых других данных с использованием заданных по умолчанию -- значений (вставленная строка должна исчезнуть после отката). Для этого -- применяется вторая операция вставки INSERT INTO MyTranTest DEFAULT VALUES Теперь выполним оператор отката ROLLBACK, явно указав в нем, что откат должен быть выполнен не к началу транзакции, а только к точке сохранения FirstPoint. После выполнения этого оператора ROLLBACK результаты всех операций, начиная с создания точки сохранения FirstPoint и закачивая вызовом оператора ROLLBACK, отменяются. Между операторами ROLLBACK и SAVE имеется только один оператор INSERT, поэтому выполняется откат именно его. В данный момент ситуация с внесением изменений в базу данных вернулась к тому, что вставлена лишь одна строка. Теперь любая попытка сослаться на точку сохранения потерпела бы неудачу, поскольку после выполнения оператора ROLLBACK все точки сохранения сбрасываются: -- Выполняется откат к первой точке сохранения. Все данные, которые были -- вставлены в таблицу ранее, остаются частью транзакции, а все прочие -- данные исчезают ROLLBACK TRAN FirstPoint Добавим еше одну строку, снова вернувшись к ситуации, в которой обшее количество вставленных строк было равно двум. Создадим также новую точку сохранения. Такие действия являются вполне допустимыми, и теперь мы получаем возможность ссылаться на эту точьсу сохранения, посколысу она была определена после выполнения оператора ROLLBACK: -- Вставка некоторого дополнительного объема данных с использованием значений, -- заданных по умолчанию. Соответствующая строка, которая введена в таблицу в -- результате выполнения третьей операции вставки, становится второй строкой -- в таблице и останется в ней после выполнения всех операций отката INSERT INTO MyTranTest DEFAULT VALUES -- Создание еще одной точки сохранения, к которой может быть выполнен откат SAVE TRAN SecondPoint После этого воспользуемся возможностью продолжить внесения изменений в базу данных и вставим еше одну строку, в результате чего обшее количество оставшихся допустимыми результатов вставки достигнет трех строк: -- Вставка еще некоторых данных. Эти данные также будут уничтожены, но на этот -- раз только после выполнения второй операции отката. Соответствующая операция -- вставки является четвертой по очереди INSERT INTO MyTranTest DEFAULT VALUES Затем выполним еше один оператор ROLLBACK, но на этот раз с указанием в нем новой точки сохранения (очевидно, что к этому времени единственно допустимой является только эта точка сохранения, поскольку точка сохранения FirstPoint была сброшена после первого оператора ROLLBACK). Это приведет к откату всех операций, которые были выполнены с момента определения точки сохранения и до момента вызова данного оператора ROLLBACK; в данном случае речь идет только об одной операции вставки, выполненной с помощью оператора INSERT. Таким образом, произойдет возврат к той ситуации, которая имела место после выполнения двух предыдущих операторов INSERT, результаты действия которых все еще остаются действительными: -- Возврат ко второй точке сохранения ROLLBACK TRAN SecondPoint После этого выполним еще один оператор INSERT, что приведет к повторному увеличению количества операторов INSERT, результаты выполнения которых все еще являются частью транзакции, до трех: -- Вставка некоторых других данных в целях проведения дальнейших экспериментов. -- Для этого применяется пятая по очереди операция вставки, а вставленная строка -- становится в таблице третьей и остается в ней после выполнения всех операций -- отката INSERT INTO MyTranTest DEFAULT VALUES Наконец (применительно лишь к рассматриваемой транзакции, но не в связи с исчерпанием возможностей дальнейшего манипулирования транзакциями) вызовем на вьшолнение оператор COMMIT TRAN, который закроет текущую транзакцию, после чего она окончательно войдет в хронологию внесения изменений в базу данных: -- Фиксация транзакции COMMIT TRAN TranStart -- Определение того, какие строки остались в таблице ко времени окончательной -- фиксации SELECT TOP 3 OrderlD FROM MyTranTest ORDER BY OrderlD DESC Важно учитывать, что если бы в любом из этих операторов ROLLBACK не было указано имя точки сохранения или указано имя, приведенное в операторе BEGIN, то произошел бы откат всей транзакции и вся транзакция рассматривалась бы как закрытая. После завершения транзакции достаточно вызвать на вьшолнение небольшой оператор, чтобы убедиться в том, что количество Ьставленных строк равно трем. Результаты вьшолнения этого оператора показывают, что в ходе транзакции происходило неоднократное добавление, а затем удаление строк: OrderlD 5 3 1 (3 row(s) affected) Вполне очевидно, что в среднем над каждой строкой было проведено по две такие операции. Наконец, уничтожим следы проведенных экспериментов, поскольку то, что осталось после транзакции, фактически нам не требуется. DROP TABLE MyTranTest Принципы функционирования журналов СУБД SQL Server Автор, безусловно, был обязан привести основные сведения о транзакциях, прежде чем приступить к описанию способов, применяемых в СУБД SQL Server для отслеживания содержимого базы данных. Дело в том, что в процессе работы объект.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |