ROLLBACK ОПЕРАТОР
В Oracle оператор ROLLBACK используется для отмены работы, выполняемой текущей транзакцией или транзакции, которая сомнительна.
Синтаксис
ROLLBACK [ WORK ] [ TO [SAVEPOINT] savepoint_name | FORCE ‘string’ ];
Параметры или аргументы
WORK
Необязательный. Он был добавлен в Oracle, чтобы быть SQL-совместимым. Выдача ROLLBACK с или без параметра WORK приведет к такому же результату.
TO SAVEPOINT savepoint_name
Необязательный. Оператор ROLLBACK отменяет все изменения для текущей сессии до точки сохранения указанного savepoint_name . Если этот пункт опущен, то все изменения отменяются.
FORCE ‘string’
Необязательный. Он используется, чтобы принудительно откатить транзакцию, которая может быть сомнительна или повреждена. С помощью этого параметра вы указываете ID (идентификатор) транзакции в одинарные кавычки, как строку. Вы можете найти ID (идентификатор) транзакции в представлении системы под названием DBA_2PC_PENDING.
Примечание
- Вы должны иметь DBA привилегии для доступа к системным представлениям — DBA_2PC_PENDING и V$CORRUPT_XID_LIST.
- Вы не можете откатить к точке сохранения сомнительную транзакцию.
Пример
Рассмотрим на примере, который показывает, как оформить откат в Oracle с помощью оператора ROLLBACK.
Этот ROLLBACK пример будет выполняться так же, как следующий:
ROLLBACK WORK;
В этом примере ключевое слово WORK означает, что первые 2 ROLLBACK утверждения эквивалентны. Эти примеры откатывают текущую транзакцию.
Savepoint
Рассмотрим пример ROLLBACK, который показывает, как использовать откат к определенной savepoint (точке сохранения).
Например, вы можете написать ROLLBACK c savepoint двумя способами:
ROLLBACK TO SAVEPOINT savepoint1;
ROLLBACK WORK TO SAVEPOINT savepoint1;
Поскольку ключевое слово WORK всегда подразумевается, оба примера ROLLBACK откатят текущую транзакцию до savepoint называемой savepoint 1.
Force
И наконец, рассмотрим пример ROLLBACK, который показывает, как принудительно откатить сомнительную транзакцию.
Например, вы можете написать ROLLBACK для сомнительных транзакций двумя способами:
ROLLBACK FORCE ‘23.15.68’;
ROLLBACK WORK FORCE ‘23.15.68’;
Поскольку ключевое слово WORK всегда подразумевается, оба из этих примеров ROLLBACK принудят к откату поврежденной или сомнительной транзакции, идентифицированной — ID транзакции ’23 .15.68 ‘.
SET TRANSACTION
В Oracle пользователю разрешается выполнять несколько операторов изменения данных как одну логическую единицу работы, заканчиваемую или сохранением результатов в базе данных, или их отменой. Транзакция начинается с первого исполняемого SQL-оператора пользователя и заканчивается явной фиксацией (завершением) или откатом со стороны пользователя.
Транзакции обрабатываются группой управляющих средств, с помощью которых пользователь может выдать команду INSERT, UPDATE или DELETE, указывающую начало серии команд изменения данных. После внесения изменений в базу данных пользователь может сохранить данные в базе, закончив транзакцию явным образом. Если же в любой момент транзакции возникает ошибка, пользователь может отменить изменения в базе данных, возвратив ее в состояние, в котором она находилась до начала транзакции. Транзакции создаются посредством двух различных элементов базы данных Oracle. Первый – это набор команд, определяющий начало, контрольные точки и окончание транзакции, а второй – специальный механизм блокирования, предотвращающий изменение информации строк базы данных несколькими пользователями одновременно.
SET TRANSACTION
Транзакции описываются следующими командами:
- SETTRANSACTION – начинает транзакцию и устанавливает ее базовые характеристики.
- COMMIT – заканчивает текущую транзакцию сохранением изменений в базе данных и начинает новую транзакцию
- ROLLBACK – заканчивает текущую транзакцию отменой изменений в базе данных и начинает новую транзакцию
- SAVEPOINT – устанавливает контрольные точки (точки прерывания) для транзакции, разрешая неполный откат.
Команда SET TRANSACTION является необязательной, так как транзакция начинается:
- после регистрации пользователя в Oracle с помощью SQL*Plus и исполнения им первой команды
- после выдачи команды ROLLBACK или COMMIT, заканчивающей транзакцию
- после выхода пользователя из системы
- в результате аварии системы
- после выдачи команды описания данными, например ALTER DATABASE
Команда COMMIT в обработке транзакций представляет тот момент времени, когда пользователь уже внес необходимые изменения как одну логическую группу, а поскольку ошибок не произошло, он готов к сохранению результатов своей работы.
Выдачей команды COMMIT в базе данных еще и неявно закрывается текущая транзакция и начинается новая. Откат транзакции выполняется не только в результате выдачи команды ROLLBACK, но и неявно, когда выполнение оператора по той или иной причине заканчивается неудачно или когда пользователь отменяет оператор командой CTRL-C.
Установка контрольных точек с помощью команды SAVEPOINT позволяет разбить весь объем работы, выполняемой транзакцией, на отдельные сегменты. Откат можно производить только до конкретной точки сохранения, оставляя предшествующие изменения в силе. Точки сохранения очень полезны в ситуациях, когда необходимо восстановить часть незавершенной транзакции.
Следующий пример показывает, что в программном блоке сохраняются только те изменения, которые были внесены до описания точки сохранения:
UPDATE my_table.products SET price=50 WHERE product=10010; SAVEPOINT точка_сохранения;
UPDATE my_table.products SET price=200; ROLLBACK TO SAVEPOINT точка_сохранения; COMMIT;
Как сделать rollback sql
ROLLBACK — прервать текущую транзакцию
Синтаксис
ROLLBACK [ WORK | TRANSACTION ]
Описание
ROLLBACK откатывает текущую транзакцию и приводит к аннулированию всех изменений, произведённых транзакцией.
Параметры
WORK
TRANSACTION
Необязательные ключевые слова, не оказывают никакого влияния.
Замечания
Чтобы завершить и зафиксировать транзакцию, используйте COMMIT .
При выполнении команды ROLLBACK вне блока транзакции выдаётся предупреждение и больше ничего не происходит.
Примеры
Чтобы прервать все операции:
ROLLBACK;
Совместимость
В стандарте SQL описаны только две формы: ROLLBACK и ROLLBACK WORK . В остальном эта команда полностью соответствует стандарту.
См. также
| Пред. | Наверх | След. |
| REVOKE | Начало | ROLLBACK PREPARED |
Как откатить завершённую транзакцию (rollback after commit)?
Есть ли какой-нибудь способ откатить завершённую транзакцию? Сделал удаление из таблицы` и фиксировал его:
delete from table; commit;
Теперь хочу откатить зафиксированные изменения. Есть ли какой-нибудь способ сделать это? Свободный перевод вопроса Rollback a committed transaction от участника @Varun
Отслеживать
задан 6 окт 2020 в 10:38
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
ассоциация:stackoverflow.com/q/19853150
6 окт 2020 в 10:41
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В общем, нельзя откатить изменения, которые были зафиксированны.
Что можно сделать в этой конкретной ситуации, как один из самых быстрых вариантов, сделать флэшбэк запрос к таблице, из которой были удалены строки, и вставить их обратно.
Обратите внимание, успех этой операции зависит от значения (по умолчанию 900 секунд) параметра UNDO_RETENTION — минимального периода времени (может изменится автоматически), в течение которого информация об откате изменений (undo records) сохраняется в табличном пространстве UNDO . То есть, если в данный момент не выполняются другие транзакции с большим количеством изменений, то шанс откатить изменения достаточно высок.
Вот простой ребочий пример:
show parameters undo_retention NAME TYPE VALUE -------------- ------- ----- undo_retention integer 900 create table t2 (col) as select level from dual connect by level
Записать срез данных на момент времени до фиксации транзакции во временную таблицу, затем вставить удалённые записи:
create table tmptab as select * from tab as of timestamp timestamp'2020-10-06 12:11:00' / Table TMPTAB created. insert into tab select * from tmptab minus select * from tab / 3 rows inserted. select * from tab / COL ---------- 1 2 3
