ITPub博客

首页 > 数据库 > Oracle > 错误ORA-02067的艰难模拟

错误ORA-02067的艰难模拟

原创 Oracle 作者:warehouse 时间:2011-09-03 21:38:54 0 删除 编辑

客户系统经常报错误ORA-02067,搜了一下,有关这个错误的解释几乎都是:

Cause: A failure (typically a trigger or stored procedure with multiple remote updates) occurred such that the all-or-nothing execution of a previous Oracle call cannot be guaranteed.

Action: rollback to a previous savepoint or rollback the transaction and resubmit.

[@more@]

下面是我的一个模拟过程:

C:>sqlplus system/system@orcl

SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 9月 3 21:33:32 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create table t(id int primary key) tablespace users;

表已创建。

SQL>
--==================================
C:>sqlplus system/system@test

SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 9月 3 21:32:37 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create table t(id int primary key) tablespace users;

表已创建。

SQL> create public database link dbl connect to system identified by system using 'orcl';

数据库链接已创建。

SQL> select sysdate from dual@dbl;

SYSDATE
-------------------
2011-09-03 21:34:10

SQL> declare
2 begin
3 insert into t@dbl values(1);
4 insert into t values(1);
5 insert into t values(1);
6 commit;
7 end;
8 /
declare
*
第 1 行出现错误:
ORA-02055: 分布式更新操作失效; 要求回退
ORA-00001: 违反唯一约束条件 (SYSTEM.SYS_C002971)
ORA-06512: 在 line 5


SQL> select sysdate from dual;
select sysdate from dual
*
第 1 行出现错误:
ORA-02067: 要求事务处理或保存点回退


SQL> rollback;

回退已完成。

SQL> declare
2 begin
3 insert into t values(1);
4 insert into t@dbl values(1);
5 insert into t@dbl values(1);
6 commit;
7 end;
8 /
declare
*
第 1 行出现错误:
ORA-02055: 分布式更新操作失效; 要求回退
ORA-00001: 违反唯一约束条件 (SYSTEM.SYS_C004151)
ORA-02063: 紧接着 line (起自 DBL)
ORA-06512: 在 line 5


SQL> select sysdate from dual;
select sysdate from dual
*
第 1 行出现错误:
ORA-02067: 要求事务处理或保存点回退


SQL>

--==================================

造成这个错误的最根本的原因是通过dblink远程更新以及同时还要涉及到本地更新时,其中一部分失败了,但是没有出错处理,或者准确的说是没有rollback,这样错误ORA-02067还不是被直接报出来,而是如果没有在该session中执行rollback,之后不论执行什么错误都会在这个session中报ORA-02067错误,那怕是执行一个查询,这也是不好模拟的原因,客户的系统报了这个错误之后输出的sql都是一个非常简单的查询,所以前面到底执行了什么sql不容易捕获。

出现错误之后如果不修改程序,我觉得似乎没有什么办法,只能是重启实例,或者断开所有连接...

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19602/viewspace-1054719/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366317