ROLLBACK
без квалификатора точки сохранения откатывает всю текущую транзакцию.
Для операторов DDL текущая транзакция для отката отсутствует. Оператор DDL неявно генерирует COMMIT
перед началом выполнения инструкции и после ее завершения. Поэтому, если вы выдаете ROLLBACK
, следуя DROP
, в текущей транзакции не было сделано никакой работы, поэтому откат невозможен.
Для операторов DML вы откатите всю текущую транзакцию.Если вы
транзакция начинается при выполнении INSERT
операции. Поэтому, когда вы выпускаете ROLLBACK
, вы откатываете как INSERT
, так и DELETE
, чтобы вернуться к отсутствию данных в таблице (при условии, что вы начали без данных). Если вы COMMIT
после INSERT
, следующая транзакция начнется с DELETE
, и ваш ROLLBACK
будет только откатывать операцию DELETE
. Кроме того, вы можете объявить точку сохранения после INSERT
и откат к точке сохранения
SQL> create table foo(col1 number);
Table created.
SQL> insert into foo values(1);
1 row created.
SQL> savepoint after_insert;
Savepoint created.
SQL> delete from foo;
1 row deleted.
SQL> rollback to savepoint after_insert;
Rollback complete.
SQL> select * from foo;
COL1
----------
1
http://stackoverflow.com/questions/4711447/oracle-ddl-and-transaction-rollback – NPE
, пожалуйста, не засуньте решение в вопрос – Sathya
@Sathya У меня нет достаточной репутации, чтобы ответить на мой собственный вопрос. Поэтому я обновился здесь, чтобы мои комментаторы знали, что вопрос разрешен, иначе им придется подождать 8 часов, и некоторые из них наверняка сожгли свое время, решив тот же вопрос. Вы должны были рассмотреть этот факт до голосования и редактирования моего ответа. Для меня я сделал правильную вещь и угадал, что! теперь, я должен написать свой ответ снова с нуля. Думаю, я должен поблагодарить вас! – kushalvm