Программирование >>  Построение запросов sql 

1 ... 88 89 90 [ 91 ] 92 93 94 ... 101


...К этому моменту никаких ошибок не обнаружено... COMMIT WORK;.

Последняя команда фиксирует изменения в базе данных, достигнутые в результате выполнения запросов SQL, составляющих транзакцию.

Вновь рассмотрим ту же самую транзакцию, но предположим, что в процессе ввода запросов SQL пользователь допустил ошибку, указав в последнем запросе ошибочную дату, например:

UPDATE PaySumma SET PaySum = 100 WHERE PayFactCD = 6;

UPDATE PaySumma SET PayDate = 05/11/2001

WHERE PayFactCD = 6;.

Так как произошла ошибка, используется команда ROLLBACK WORK. Все изменения в базе данных, декларированные запросами внутри транзакции, отменяются, и база данных возвращается к состоянию на момент начала транзакции.

Таким образом, возможны два варианта завершения транзакции:

- транзакция фиксируется, если все операторы выполнены успешно и в процессе выполнения транзакции не произошло никаких сбоев программного или аппаратного обеспечения;

- база данных должна быть возвращена в исходное состояние, если в процессе выполнения транзакции случилось то, что делает невозможным ее нормальное завершение.

В общем случае транзакция завершается одним из четырех возможных путей:

- использование команды COMMIT в случае успешного завершения транзакции;

- использование команды ROLLBACK в случае прерывания транзакции;

- успешное завершение программы, в которой была инициирована текущая транзакция, означает успешное завершение транзакции (как будто была использована команда COMMIT);

- ошибочное завершение программы прерывает транзакцию (как будто была использована команда ROLLBACK).

На рис. 7.3 в графическом виде представлены типичные транзакции, иллюстрирующие четыре перечисленные ситуации [11].




Рис. 7.3. Выполненные и отмененные транзакции

В СУБД Firebird существует возможность задавать пользовательские точки сохранения (альтернативное имя - вложенные транзакции) и затем откатывать транзакцию не полностью, а частично - до этих точек [18, 28]. Место расположения точки сохранения в транзакции указывает оператор SAVEPOINT, который имеет следующий синтаксис:

SAVEPOINT имя точки сохранения;.

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

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

Возврат на точку сохранения начинается с отмены всей работы, выполненной после создания этой точки сохранения. Указанная точка сохранения и все предшествующие ей сохраняются, а те точки, которые были созданы после указанной точки сохранения, пропадают. Еще одна особенность отката до



контрольной точки заключается в том, что транзакция не завершается. Т. е. оставшиеся изменения, если требуется, надо зафиксировать.

Рассмотрим следующий пример использования точек сохранения: CREATE TABLE Test (ID INTEGER);

COMMIT;

INSERT INTO Test VALUES (1);

COMMIT;

INSERT INTO Test VALUES (2); SAVEPOINT y;

DELETE FROM Test;

SELECT * FROM Test; -- не вернет ничего

ROLLBACK TO y;

SELECT * FROM Test; -- вернет две строки

ROLLBACK;

SELECT * FROM Test; -- вернет одну строку.

Механизм реализации точек сохранения на сервере может требовать значительного количества ресурсов, особенно если одни и те же строки изменяются многократно в течение одной транзакции. Ресурсы уже ненужных точек сохранения могут быть освобождены при использовании оператора RELEASE SAVEPOINTS, имеющего следующий синтаксис:

RELEASE SAVEPOINTS имя точки сохранения [ONLY];.

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

Точки сохранения оказываются полезными в интерактивных программах, так как они позволяют выделять и именовать промежуточные шаги программы [16]. Это позволяет гибко управлять сложными программами. Например, можно проставить точки сохранения в длинной цепочке обновлений. При этом, обнаружив ошибки, можно будет произвести откат к нужному месту и тем самым не выполнять повторно все обновления, как если бы был произведен откат всей транзакции.

Точки сохранения также оказываются полезными при написании прикладных программ. Если программа содержит подпрограммы, можно проставить точки сохранения перед обращением к каждой из подпрограмм. Если подпрограмма завершилась аварийно, можно восстановить БД на момент до выполнения этой подпрограммы.

7.2.3. Восстановление системы

Система должна быть готова к восстановлению не только после небольших локальных нарушений (таких, как невыполнение операции в пределах



1 ... 88 89 90 [ 91 ] 92 93 94 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика