Chinaunix首页 | 论坛 | 博客
  • 博客访问: 213613
  • 博文数量: 57
  • 博客积分: 1376
  • 博客等级: 中尉
  • 技术积分: 658
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 09:51
文章分类

全部博文(57)

文章存档

2012年(1)

2011年(56)

分类: Oracle

2011-03-06 21:49:22

在往一个表里插入很大的数据时,出现了如下错误:

SQL> select * from t;

no rows selected

SQL> begin
  2     for i in 1..100000000 loop
  3        insert into t values(i);
  4     end loop;
  5  end;
  6  /
begin
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS01'
ORA-06512: at line 3


SQL> select * from t;

no rows selected


undo的一个错误, 很典型。提交本来应该放在出入完之后, 但是中途错误,导致事物rollback。
看了看出错原因和解释如下:
  1. [oracle@milo liuzhou]$ oerr ORA 30036
  2. 30036, 00000, "unable to extend segment by %s in undo tablespace '%s'"
  3. // *Cause: the specified undo tablespace has no more space available.
  4. // *Action: Add more space to the undo tablespace before retrying
  5. //                the operation. An alternative is to wait until active
  6. //                transactions to commit.

Tom 在其体系结构书中提到过,如果产生了ora-30036错误,那么数据就处于一种已知状态,要么事物完成,要么事物未完成, 但是,如果用循环的方式,小范围提交,则会出现,snapshot too old的错误,会导致数据状态未知。

刚突发奇想, 在每次提交的时候,能否加个标记去解决数据未知的情况呢,这样的话,至少,要鉴定已提交数据,会节省些时间, 比如100行提交, 1000行提交时,输出一个值。用这个值去大概判断大概数据在什么位置之前是已经提交了的。

但是,由引申出另一个问题,pl/sql上的应用,再调用的时候,根本不会去管这个值。。。。

应该如何去解决呢?

阅读(2704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~