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