ROLLBACK
Версии сервера
| 2.5 | 3.0 | 4.0 | 5.0 | 6.0 |
|---|---|---|---|---|
| Да | Да | Да | Да | Да |
Доступно в
Формат
ROLLBACK [WORK] [TRANSACTION tr_name]
[RETAIN [SNAPSHOT] | TO SAVEPOINT sp_name] [RELEASE];
| Параметр | Описание |
|---|---|
tr_name | Имя транзакции. Доступно только в ESQL. |
sp_name | Имя точки сохранения. Доступно только в DSQL. |
Описание
Оператор ROLLBACK отменяет все изменения данных базы данных (добавление, изменение, удаление), выполненные в контексте транзакции. Оператор никогда не вызывает ошибок. Если не указано предложение RETAIN, при его выполнении освобождаются все ресурсы сервера, связанные с данной транзакцией.
Необязательное предложение TRANSACTION задаёт имя транзакции и доступно только в Embedded SQL. За счёт именованных транзакций допускается одновременный запуск нескольких активных транзакций в одном приложении; при этом должна быть объявлена и инициализирована одноимённая переменная базового языка. Если TRANSACTION не указано, оператор применяется к транзакции по умолчанию. Ключевое слово WORK используется только для совместимости с другими СУБД.
Ключевое слово RETAIN указывает, что все изменения данных отменяются, а транзакция остаётся активной, сохраняя свой идентификатор, контекст и курсоры. Для уровней изоляции SNAPSHOT и SNAPSHOT TABLE STABILITY вид базы данных остаётся таким, каким он был при старте транзакции; для READ COMMITTED база принимает состояние на момент выполнения ROLLBACK RETAIN. При откате с сохранением контекста заново выполнять SELECT не требуется.
Предложение TO SAVEPOINT (только DSQL) выполняет откат к именованной точке сохранения: отменяются только изменения, сделанные после её создания, освобождаются соответствующие блокировки строк, а более поздние точки сохранения удаляются. Значения пользовательского контекста, установленные через RDB$SET_CONTEXT(), при откате к точке сохранения не сбрасываются.
Пример
Полный откат транзакции:
UPDATE employees SET salary = salary * 1.1 WHERE dept_no = 600;
-- решение изменено: отменяем обновление целиком
ROLLBACK;
Частичный откат к точке сохранения:
INSERT INTO orders (order_id, customer_id) VALUES (1001, 15);
SAVEPOINT before_details;
INSERT INTO order_details (order_id, product_id, qty) VALUES (1001, 220, 3);
-- ошибка в данных позиций: откатываемся к точке сохранения,
-- сама вставка заказа сохраняется
ROLLBACK TO SAVEPOINT before_details;
См. также
COMMIT, SAVEPOINT, SET TRANSACTION, Разновидности языка SQL
Источник
Руководство по языку SQL СУБД Firebird 5.0 (sim1984 / ibase.ru, Public Documentation License)
Обсуждение