ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORA-02046分布式事务已经开始

ORA-02046分布式事务已经开始

原创 Linux操作系统 作者:testmvb 时间:2010-04-20 14:15:47 0 删除 编辑
该错误在远程调用存储过程执行的时候可能会出现。ORACLE官方并没有给出有效的解决方法。
[oracle@testdb1 ~]$ oerr ora 2046
02046, 00000, "distributed transaction already begun"
// *Cause: internal error or error in external transaction manager.
//         A server session received a begin_tran RPC before finishing
//         with a previous distributed tran.
[oracle@testdb1 ~]$
该错误会在更新的表上加 分布式锁,该类型的锁会阻塞查询。
在METALINK上找到的ORACLE官方的建议是CONTACT ORACLE SUPPORT. 自己做了一些分析,再现了该错误。

这个错误在RPC调用存储过程和包。被引用的包或过程中又有引用其他的DB_LINK,且包中有事务控制语句的 情况下会发生。
如下为所做的实验。
两个库DB1,DB2.分别创建到对方的DB_LINK
DB2
上编写存储过程
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

create or replace procedure TESTDT(V_ID1 IN NUMBER, V_ID2 IN NUMBER) is

begin

  update tlink set status = 'SUCCEED'

    where tid= V_ID1;

  COMMIT;

  update tlink set status = 'SUCCEED'

    where tid= V_ID2;

  update bobo.tlink@db2

    set status = 'SUCCESS'

  where tid = v_id2;

end TESTDT;

DB1上调用该存储过程。
SQL> exec bobo.testdt@db2(1,2);

PL/SQL 过程已成功完成。

SQL> exec bobo.testdt@db2(1,2);

BEGIN bobo.testdt@db2(1,2); END;

 *

第 1 行出现错误:

ORA-02046: distributed transaction already begun

ORA-06512: 在 line 1SQL> select * from bobo.tlink@db2;

SQL> select * from bobo.tlink@db2

                   *

第 1 行出现错误:

ORA-02046: distributed transaction already begun

ORA-02063: 紧接着 line (起自 DB2)


   对该错误的解决方法: 不要在远程调用的存储过程或者包中使用事务控制语句。因为远程调用的包执行时没有机制执行2-phase commit.

   事务控制语句应该在发起事务的节点执行。

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

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

注册时间:2008-02-23

  • 博文量
    51
  • 访问量
    176394