锁被有问题的分布式事务处理

ORA-01591 锁被有问题的分布式事务处理

在写pl/sql的时候,有个很重要的注意点;
比如:
begin
  update  某个sqlserver的表@dblink名字 .....;
  update 某个oracle的表...;
end;

这段pl/sql执行会报错:
错误信息是:
-----------------------------------------------------------------
执行失败:ORA-02054: 事务处理 2.12.27634 有问题
ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息:
[Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效。
ORA-02063: 紧接着 2 lines (起自 dblink名字)
-----------------------------------------------------------------

然后你执行:
  select * from    某个sqlserver的表@dblink名字
这个没问题;

再执行:
select * from  某个oracle的表

完了!结果提示:
执行失败:ORA-01591: 锁被有问题的分布式事务处理 2.12.27634 持有

这时候,你查询:
SELECT * FROM DBA_2PC_PENDING
会发现,被锁的信息;

然后,你用
commit/rollback force '2.12.27634' ;  解锁;

当然这里的2.12.27634 是随机的。每次被锁,都是不同的值;


这个问题如何解决呢?
begin
  update  某个sqlserver的表@dblink名字 .....;
  commit; --非常重要;
  update 某个oracle的表...;
end;
这样就OK了,原因我觉得是这样的:oracle内部其实是两块事务,一个是针对sqlserver,一个针对自己的oracle;
所以必须把两端的事务独立下来;

下面这个写法也是OK的:

begin
  update  某个sqlserver的表@dblink名字 .....;
update  某个sqlserver的表@dblink名字 .....;
  commit; --非常重要;
  update 某个oracle的表...;
update 某个oracle的表...;
end;
 
转载自http://hi.baidu.com/graceyan/item/da33101a33e033f99d778aa8

猜你喜欢

转载自chenhongbinjs.iteye.com/blog/1872713