本帖最后由 wildck 于 2012-10-03 21:02:32 编辑

解决方案 »

  1.   

    如果应用程序代码不发出COMMIT后,远程或分布式的select语句,然后回滚段条目不会被释放。plsql认为有回滚的东西。
    建议你看看这个解释。洋文的
    http://www.jlcomp.demon.co.uk/faq/dblink_commit.html
      

  2.   

    这里面说的意思好象是说在pl/sql程序上select from a@dblink 数据时,如果数据过多,界面上只能显示部分数据,另外部分数据没显示出来,这个时间那个事务的按钮确实亮了,如果按下pl/sql上面的显示到最后一页的按钮。这个时候提交事务的按钮就变灰了,我的情况是在procedure 中把cursor 中的数据循环赋值给本地变更,cursor的数据来自远程数据库,
    执行这样一个过程,到过程执行完,调试界面的那个提交事务按钮就亮了,而有些程序里面也是从远程数据库取数据并赋值,过程调试执行完成后就不会出现这样的信息
      

  3.   

    cursor是不是以select for update方式打开的?
      

  4.   

    没有,就是cursor is select ... from  tablename@dblink.....; 没for update过程里面没有一个insert update delete truncate 语句,就是从两个远程数据库去取数据,然后循环赋值给变更,接着就结束了程序。数据库版本是10.0.2.1 ,有兴趣的大虾到公司了可以试简单写个这样的过程试下,看看是什么样的情况,谢谢
      

  5.   

    拿个实际的代码大家看下,用pl/sql程序执行完后,事务提交按钮是有事务可以提交的
     v$lock 视图也会有一个type = tx 的事务
    create or replace procedure p_test is
    inum number;
    ibody clob;
    cursor c1 is select *  from dual@dblink_name connect by rownum < 3;
    begin
     inum := 0;
    for rec in c1 loop
     inum := inum + 1;
     ibody := ibody||rec.dummy||chr(13);
    end loop;
    dbms_output.put_line(inum||ibody);
    exception 
      when others then
      dbms_output.put_line(sqlerrm);
    end; 
      

  6.   

    加COMMMIT不是解决方法,有时候COMMIT会报ORA02050的错误
    ORA-02050: transaction 8.79.760874 rolled back, some remote DBs may be in-doubt
      

  7.   

    在数据库中如果你是远程访问数据库的时候数据库就会默认你有事务要提交。。这个不提交也可以。。没有影响。
    好像以前看过一个东西说如果是远程查询。其实调用的的是select * from table forupdate这样的形式。所以会提示你提交事务。
      

  8.   

    这个情况下,我把这个过程用JOB调用的话,JOB有自动COMMIT的动作,然后JOB每次执行都失败,
    实际COMMMIT的时候会报
    ORA-02050: transaction 8.79.760874 rolled back, some remote DBs may be in-doubt
    ORA-02052
    ORA-02063这三个错误呢,有什么好的方法解决没,有的时候就没这样的错误,好郁闷