回滚(Rollback)指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。回滚包括程序回滚和数据回滚等类型。

execute执行后 可以回滚

commit提交后 不可以回滚


其实Oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交。对应的PL\SQL也是要先点execute执行,执行后再点commit提交。

但是 commit提交后 可以用闪回查询恢复原来的数据 因为oracle会将近期的数据保存到快照中 如:


SELECT * FROM tab AS OF TIMESTAMP TO_TIMESTAMP('20130506 20:00:00','YYYYMMDD HH24:MI:SS');

这里'20130506 20:00:00'就是你想恢复数据到哪个时间状态 tab是数据库的表名 这样查询到的数据就是执行更新操作之前的数据


    --查看和UNDO相关的参数

        SQL> SHOW PARAMETER undo;

 

        NAME                                 TYPE        VALUE

        ------------------------------------ ----------- ------------------------------

        undo_management                      string      MANUAL

        undo_retention                       integer     900

        undo_tablespace                      string      UNDOTBS1

           

    undo_management:

        设置数据库的撤销段是否使用自动管理模式,值可以为auto或manual,当为manual时将不使用撤销段,即不使用自动管理模式

        该参数为静态参数,修改后需重启实例才能生效       

    undo_retention:

        指定撤销段数据在undo段中为非活动状态后被覆盖前保留的时间,单位为秒。在undo_management位auto时生效,为动态参数      

    undo_tablespace:

        指定使用哪个表空间来实现数据的撤销,在undo_management位auto时生效,为动态参数

语法

ROLLBACK [WORK] [TO [SAVEPOINT] savepoint_name | FORCE 'string'};

work - 可选。隐式关键字,可写可不写。

to savepoint savepoint_name - 可选。rollback 语句撤销当前会话的所有更改,直到由 savepoint_name 指定的保存点。如果省略该子句,则所有更改都将被撤销。

force 'string - 可选'。用于 强制回滚 可能已损坏或有问题的事务。使用此子句,可以将单引号中的 事务id 指定为 字符串。可以在 系统视图 中找到名为 dba_2pc_pengding、v$corrupt_xid_list 的事务标识(无法将有问题的事务回滚到保存点。)

---------------------


回滚与删除

commit rollback savepoint

这组操作在sql命令行,connect scott/TIGER @XE

1.删除emp数据表中的记录

delete emp;

select * from emp;

看到14行记录全部删除

关闭当前登录窗口,再次登录到sql命令行中。

select * from emp;

2.在dept中添加一条记录,50,DATAC,JINAN

insert into dept values(50,‘datac’,‘jinan’);

select * from dept;

关闭当前登录窗口,再次登录到sql命令行

select * from dept;

3.修改40部门的名称datac

update dept set dname=‘datac’

where deptno=40;

select * from dept;

关闭当前登录窗口,再次登陆到sql命令行

select * from dept

使用commit提交命令来实现,数据增删改

update dept set dname=‘datac’

where deptno=40;

select * from dept;

加入一条:commit

关闭当前登录窗口,再次登录到sql命令行中。

select * from dept;

2. rollback

truncate(截断 删除后不可恢复)

(1)回滚到原点

删除emp数据表中所有的记录

delete emp;

select * from emp;

rollback;

(2)应用savepoint设定回滚点

也是拿dept信息表做案例

插入一条记录50 software shanghai

insert into dept values(50,‘software’,‘shanghai’)

select * from dept;

设置存储点A

savepoint a

修改将办公地点shanghai修改beijing

update dept set loc=‘beijing’

where deptno=50;

select * from dept;

设定存储点B

savepoint b

删除操作40部门的信息

delete dept where deptno=40;

select * from dept;

回滚到存储点B

rollback to B

---------------------

作者:懿范