zoukankan      html  css  js  c++  java
  • update问题ORA02055: distributed update operation failed; rollback required

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        

    近来同事遇到一个奇异的问题告急,以下奉上外洋大神的问题重现及解决方法

        ------------------------------------------------------------------------------------------------------------------------------

        ORA-02055: distributed update operation failed; rollback required

        

     

        

     

        

    --------------------------------------------------------------

        You call a remote procedure or package over a database link.

        Now, on the other side (the remote side), there was an error encountered, but there were already some statements executed successfully.

        Now you will need to perform a rollback before you can do a select on the calling side, or you will get this error.

        原因:通过数据库链接调用近程存储过程或包。然而,执行过程当中近程数据库有报错,但是部份语句已胜利执行

        措施:在调用端可以查询之前,需要执行回滚操作,否则将获得以上错误提示。

        问题重现:

    -- First we create some test users
    
    SQL> drop user test1 cascade;
    
    User dropped.
    
    SQL> drop user test2 cascade;
    
    SQL> create user test1 identified by test1;
    
    User created.
    
    SQL> create user test2 identified by test2;
    
    User created.
    
    SQL> grant create session, create table, create trigger, create procedure, create database link to test1, test2;
    
    Grant succeeded.
    
    SQL> alter user test1 quota unlimited on system;
    
    User altered.
    
    SQL> alter user test2 quota unlimited on system;
    
    User altered.

        Now we connect to test 2 (remote user) and create a table

        每日一道理
    闷热的天,蝉儿耐不住寂寞地不停在鸣叫,我孤单一人,寂静的身旁没有一个知音,想疯狂地听摇滚乐,听歇斯底里的歌声,那只为逃避无人的世界里那浓烈的孤单气息。一个人是清冷,两个人便是精彩,于是,莫名的冲动让我格外想念旧日的好友,怀念过去的日子,尽管不够现实的遐想追回不了曾经一切,但却希望思绪可以飞扬于闭上双目后的世界中,印有微笑,印有舞动的身姿,翩翩起舞……
    SQL> conn test2/test2@XE
    Connected.
    
    SQL> create table test2_tab(n number);
    
    Table created.
    
    SQL> insert into test2_tab values(1);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.

        In order to demonstrate this error, we create a trigger on the newly created table, but make sure the trigger fails. In our case, we assign a character to a number field:

    create or replace trigger test2_tab_bir
    before insert on test2_tab
    for each row
    begin
      :new.n := 'a';
    end;
    /
    
    Trigger created.

        Connect to test1, create database link

    SQL>  conn test1/test1@XE
    Connected.
    SQL>
    
    SQL> create database link test2 connect to test2 identified by test2 using 'XE';
    
    Database link created.

        Now we will create a procedure which will first do a successful dml, after that a dml that fails due to the incorrect trigger:

    create or replace procedure p is
    begin
      -- first do a statement that executes ok
      update test2_tab@test2 set n=2;
      -- next statement will fail because of the invalid trigger
      insert into test2_tab@test2 values(1);
    end;
    /
    
    Procedure created.

        Call the procedure, it will fail:

    SQL> exec p
    BEGIN p; END;
    
    *
    ERROR at line 1:
    ORA-02055: distributed update operation failed; rollback required
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at "TEST2.TEST2_TAB_BIR", line 2
    ORA-04088: error during execution of trigger 'TEST2.TEST2_TAB_BIR'
    ORA-02063: preceding 3 lines from TEST2
    ORA-06512: at "TEST1.P", line 4
    ORA-06512: at line 1

        Now we have a failed distributed transaction, you need to rollback, else you will get the error when selecting ANY table/view

    SQL> select sysdate from dual;
    select sysdate from dual
                        *
    ERROR at line 1:
    ORA-02067: transaction or savepoint rollback required
    
    -- also happens when oracle itself calls another select recursively (notice the ORA-00604)
    
    SQL> select * from user_2pc_pending;
    select * from user_2pc_pending
                  *
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-02067: transaction or savepoint rollback required

        -----------------------------------

        Present  By  Dylan.

    文章结束给大家分享下程序员的一些笑话语录: 女人篇
      有的女人就是Windows虽然很优秀,但是安全隐患太大。
      有的女人就是MFC她条件很好,然而不是谁都能玩的起。
      有的女人就是C#长的很漂亮,但是家务活不行。
      有的女人就是C++,她会默默的为你做很多的事情。
      有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
      有的女人就是SQL,她会为你的发展带来莫大的帮助。

    --------------------------------- 原创文章 By
    update和问题
    ---------------------------------

  • 相关阅读:
    【转载】CentOS 6.3(x86_64)下安装Oracle 10g R2 天高地厚
    Oracle查看表空间和删除表空间 天高地厚
    获取android手机的定位信息(转)
    android里pull解析xml文件
    google map 开发去掉图片阴影
    ubuntu12.04配置android开发环境遇到的问题
    google code中下载你的项目源码
    android无法自动生成R文件
    android中ocr解决方案(tesseract)
    自定义Android标题栏TitleBar布局(转)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3111350.html
Copyright © 2011-2022 走看看