您的位置:首页 > 数据库

ORA-00604: 递归SQL级别1出现错误, ORA-02067:要求事务处理或保存回退点

2016-09-07 14:49 555 查看
报的错如题:

ORA-00604: 递归SQL级别1出现错误 

ORA-02067:要求事务处理或保存回退点

A服务器oracle建立dblink,存储过程的内容是:往B服务器中oracle的表里插入数据。 在客户端访问调用此存储过程的时候报以上错误。

解決模拟

客户系统经常报错误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不容易捕获。
出现错误之后如果不修改程序,我觉得似乎没有什么办法,只能是重启实例,或者断开所有连接...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐