При успешном завершении выполнения транзакции соответствующая таблица не изменяется немедленно, хотя соответствующие сообщения вывода создают именно такое впечатление. Для успешно завершившихся транзакций предусмотрены команды управления транзакциями, позволяющие либо сохранить в базе данных все предлагаемые транзакцией изменения, либо отменить их.
Управление транзакциями осуществляется с помощью следующих трех команд:
• COMMIT
• ROLLBACK
• SAVEPOINT Все они подробно обсуждаются в следующих разделах.
Команды управления транзакциями используются только с командами DML INSERT, UPDATE и DELETE. Например, оператор COMMIT не используется для подтверждения создания таблицы. При создании таблицы операция ее создания подтверждается автоматически. Точно так же нельзя с помощью команды ROLLBACK вернуть таблицу, только что удаленную из базы данных.
После завершения транзакции соответствующая ей информация сохраняется в специальном разделе (области) базы данных, предназначенной для хранения временных данных. Все соответствующие изменения будут сохраняться в этой области, пока к ним не будет применена соответствующая команда управления транзакциями. В результате применения такой команды соответствующие изменения либо вносятся в базу данных, либо отменяются, после чего область для хранения временных данных освобождается. Рис. 6.1 иллюстрирует процесс внесения изменений в реляционную базу данных.
Команда COMMIT используется для передачи базе данных (сохранения) изменений, инспирированных транзакцией. Команда COMMIT сохраняет все транзакции, выполненные с момента предыдущего применения либо команды COMMIT, либо команды ROLLBACK.
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 можно использовать для отмены только тех транзакций, которые были выполнены после применения последней из команд 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;
Отмена выполнена.
Наконец, проверим, что изменения не были переданы базе данных.
PROD_ID PROD_DESC COST
11235 КОСТЮМ ВЕДЬМЫ 29.99
90 ФОНАРИ 14.5
2345 ПОЛОЧКА ИЗ ДУБА 59.99
3 строки выбраны.
Команда SAVEPOINT определяет точку в транзакции, к которой можно будет возвратиться, чтобы не отменять всю транзакцию. Синтаксис команды SAVEPOINT следующий.
SAVEPOINT ИМЯ_ТОЧКИ_ОТКАТА;