在往一个表里插入很大的数据时,出现了如下错误:
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。
看了看出错原因和解释如下:
- [oracle@milo liuzhou]$ oerr ORA 30036
- 30036, 00000, "unable to extend segment by %s in undo tablespace '%s'"
-
// *Cause: the specified undo tablespace has no more space available.
-
// *Action: Add more space to the undo tablespace before retrying
-
// the operation. An alternative is to wait until active
-
// transactions to commit.
Tom 在其体系结构书中提到过,如果产生了ora-30036错误,那么数据就处于一种已知状态,要么事物完成,要么事物未完成, 但是,如果用循环的方式,小范围提交,则会出现,snapshot too old的错误,会导致数据状态未知。
刚突发奇想, 在每次提交的时候,能否加个标记去解决数据未知的情况呢,这样的话,至少,要鉴定已提交数据,会节省些时间, 比如100行提交, 1000行提交时,输出一个值。用这个值去大概判断大概数据在什么位置之前是已经提交了的。
但是,由引申出另一个问题,pl/sql上的应用,再调用的时候,根本不会去管这个值。。。。
应该如何去解决呢?
阅读(2750) | 评论(0) | 转发(0) |