Совокупность команд SQL, результаты действия
которых для базы данных представляет собой единое целое, называется
транзакцией или логической единицей работы. В упрощенном
представлении, транзакции содержат либо команды DML, выполняющие единое
согласованное изменение данных, либо одну команду DDL или DCL.
Транзакции начинаются с выполнения первой исполняемой команды SQL и
заканчиваются либо фиксацией изменений в базе данных, либо отказом от фиксации
(откатом). Окончанием транзакции может служить одно из следующих событий:
выполнение команды COMMIT или ROLLBACK;
выполнение команды DDL или DCL (автоматическая фиксация);
ошибка, завершение сеанса работы или аварийный останов системы
(автоматический откат).
При выполнении команд SQL COMMIT или ROLLBACK
происходит явная обработка транзакции. При этом обеспечивается согласованность
данных; появляется возможность проверить изменения в данных прежде, чем сделать
их постоянными; взаимосвязанные операции логически группируются.
Неявная обработка транзакций приводит к автоматической фиксации изменений или
автоматическому откату.
Автоматическая фиксация изменений (COMMIT) происходит в следующих случаях:
выполнение команды DDL (например, CREATE);
выполнение команды DCL (например, GRANT);
нормальный выход из SQL*Plus без явной посылки команды COMMIT или
ROLLBACK.
Автоматический откат (ROLLBACK) выполняется в случае аварийного прекращения
сеанса работы в SQL*Plus или отказа системы.
Пример. Во время удаления записи из таблицы
TEST случайно стерты все данные этой таблицы. Ошибка
исправляется, посылается правильная команда, и изменения фиксируются.
Откат до маркера
С помощью команды SAVEPOINT можно создать в текущей транзакции маркеры для
отката. Откат до такого маркера выполняется с помощью команды ROLLBACK TO.
Откат на уровне команды
Если ошибка возникла при выполнении одной конкретной команды DML, отменяются
только результаты этой команды. Для этого Oracle использует неявную точку
сохранения.
При откате на уровне команды все прочие изменения сохраняются и пользователь
должен завершить транзакцию явно командой COMMIT или ROLLBACK.