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

Управление транзакциями осуществляется с помощью следующих трех команд:

• COMMIT

• ROLLBACK

• SAVEPOINT Все они подробно обсуждаются в следующих разделах.

Команды управления транзакциями используются только с командами DML INSERT, UPDATE и DELETE. Например, оператор COMMIT не используется для подтверждения создания таблицы. При создании таблицы операция ее создания подтверждается автоматически. Точно так же нельзя с помощью команды ROLLBACK вернуть таблицу, только что удаленную из базы данных.

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

Команда COMMIT

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

Рис. 6.1. Область изменений, допускающих отмену Синтаксис команды следующий.

COMMIT [ WORK ];

Здесь обязательным является только ключевое слово COMMIT вместе с зависящим от реализации символом или командой, означающей завершение оператора. Ключевое слово WORK абсолютно необязательно - его единственной целью является придание команде более понятного вида.

Начнем с выбора всех данных из таблицы PRODUCTS_TMP.

SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

222 ПЛАСТИКОВЫЕ ТЫКВЫ 7.75

13 ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ 1.1

90 ФОНАРИ 14.5

15 КОСТЮМЫ В АССОРТИМЕНТЕ 10

9 СЛАДКАЯ КУКУРУЗА 1.35

6 ТЫКВЕННЫЕ КОНФЕТЫ 1.45

87 ПЛАСТИКОВЫЕ ПАУКИ 1.05

119 МАСКИ В АССОРТИМЕНТЕ 4.95

1234 ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ 5.95

2345 ПОЛОЧКА ИЗ ДУБА 59.99

11 строк выбраны. Затем удалим из таблицы все записи для товаров, стоимость которых меньше $14,00.

DELETE FROM PRODUCTSJTMP

WHERE COST < 14;

8 строк удалено.

Для того чтобы передать базе данных изменения, проведенные транзакцией, применяется оператор COMMIT:

COMMIT;

Передача выполнена.

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

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

Команда ROLLBACK

Команда ROLLBACK используется для отмены транзакций, которые еще не были сохранены в базе данных. Команду ROLLBACK можно использовать для отмены только тех транзакций, которые были выполнены после применения последней из команд COMMIT или ROLLBACK.

Синтаксис команды ROLLBACK следующий.

rollback [ work ] ;

Как и в операторе COMMIT, ключевое слово WORK здесь тоже является необязательным.

В следующем примере сначала выберем все записи из таблицы PRODUCTS_TMP, оставшиеся в ней после удаления 8 записей.

SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны.

Затем изменим таблицу, приписав стоимость $39.99 товару с кодом 11235.

UPDATE PRODUCTS_TMP

SET COST = 39.99 WHERE PROD_ID = "11235';

1 строка обновлена.

Запрос к таблице покажет, что изменения как будто бы внесены. SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 39.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны. Теперь используем команду ROLLBACK, чтобы отменить последние изменения.

ROLLBACK;

Отмена выполнена.

Наконец, проверим, что изменения не были переданы базе данных.

SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны.

Команда SAVE POINT

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

SAVEPOINT ИМЯ_ТОЧКИ_ОТКАТА;

Перейти на страницу:

Похожие книги