网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  oracle所进行的回滚仅针对用户发出的事务 (1)     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:90次  录入:管理员--2008-02-27  
 

大家都知道,回滚是数据库的一种能力,在语句或者事务发生错误,或者用户发出rollback语句的时候,将语句的影响或者整个事务的操作恢复到语句或事务执行之前的状态。也就是说,回滚使得语句和事务好像根本没有执行一样。

事实上真正回滚的只是用户发出的事务,而并非所有的一切都和事务开始前是一样的。

事务是所有关系型数据库的基本特性之一。所有的事务最终不外乎两种状态,提交和回滚。对于分布式事务,可能会产生第三种情况,也就是说,这个事务是悬而未决的。但是这种状态通过dba的手工干预,最终也是会变成提交或者回滚状态。

大家需要留意的是,oracle所进行的回滚仅仅是针对用户发出的事务而言,而很多的东西并不会随回滚的发生而回到原始的状态。比如包中的变量,它并不会随着事务的回滚而回复到事务开始之前的状态:

sql> create table t_rollback (id number);
表已创建。

sql> create or replace procedure p_test(p_out out number) as
2 begin
3 insert into t_rollback (id) values (1);
4 select count(*) into p_out from t_rollback;
5 end;
6 /

过程已创建。

sql> set serverout on
sql> declare
2 v_return number;
3 begin
4 p_test(v_return);
5 dbms_output.put_line(v_return);
6 rollback;
7 dbms_output.put_line(v_return);
8 end; 
9 /
1
1

pl/sql 过程已成功完成。

对于oracle来说,回滚的对象是用户对数据的修改,而过程内部的变量并不会随着事务的回滚而恢复的初始状态。对于系统包中保存的变量的状态也是如此。

如果考虑自治事务,那么无法进行回滚的对象将更多:

sql> create or replace procedure p_test as
2 pragma autonomous_transaction;
3 begin
4 insert into t_rollback (id) values (1);
5 commit;
6 end;
7 /

过程已创建。

sql> select * from t_rollback;

未选定行

sql> exec p_test

pl/sql 过程已成功完成。

sql> insert into t_rollback (id) values (2);

已创建 1 行。

sql> select * from t_rollback;

id
----------
1
2

sql> rollback;

回退已完成。

sql> select * from t_rollback;

id
----------
1

除了用户自定义的自治事务无法被回滚,一些通过自治事务实现的功能,也是回滚无法恢复的。比如序列和审计。

sql> create sequence s_1;

序列已创建。

sql> select s_1.nextval from dual;

nextval
----------
1

sql> rollback;

回退已完成。

sql> select s_1.nextval from dual;

nextval
----------
2

回滚无法使序列的nextval值恢复到事务执行之前,同样的,即使dml被回滚,dml的审计也会记录下来:

sql> show parameter audit_trail

name type value
--------------- ----------- ------------------
audit_trail string db
sql> audit insert on t_rollback;

审计已成功。

sql> insert into t_rollback (id) values (3);

已创建 1 行。

sql> rollback;

回退已完成。

sql> col obj$name format a30
sql> select sessionid, userid, obj$name from sys.aud$;

sessionid userid obj$name
---------- ------------------------------
672 yangtk t_rollback

假如再考虑oracle本身的操作,那么回滚无法恢复原始状态的操作就太多了。比如dml语句产生的redo、undo;dml语句造成数据文件的修改;dml语句造成表和索引空间的扩展;语句的分析并cache在共享池;语句影响的block被cache在db_cache等等。即使将dml语句进行回滚,以上这些操作所产生的影响也已经存在了。

 
 
上一篇: 使用type方式,解决in列表过长的问题 (1)    下一篇: pfile创建spfile后数据库无法启动的问题
  相关文档
unix系统环境下设置自动开关数据库的方法 08-18
帮你充分认识 Oracle 数据库表与视图 05-13
做Oracle的和作茶叶蛋的没有本质的区别 09-01
用pipelined table实现split函数的示例 06-23
ip地址变化后oracle 10g如何才能不受影响 04-15
如何使用exp以传输表空间的方式将其导出 08-12
通过意向锁多粒度封锁机制进行并发控制 (1) 04-11
使用oracle功能特性提高应用执行效率 (1) 04-15
三方面描述Oracle优化R方法(Method R) 05-27
Oracle中用SQL语句实现进制间互相转换 07-07
借助两个开发包在pl/sql中实现多进程通信 06-20
在oracle数据库中按用户名重建索引的方法 07-30
oracle 9i sys_context函数的使用方法 07-04
oracle 9i在aix上的性能调整──内存篇 06-13
用VC++开发Oracle数据库应用程序详解 04-11
怎样选择适合的Oracle优化器 09-29
带你快速了解wait等待事件及其处理方法 04-17
如何对系统默认的约束名和索引名重命名 02-29
怎样使用errorstack进行错误跟踪及诊断 11-15
教你在Oracle数据库中建立透明网关环境 04-11
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息