原帖由 qingyun 于 2010-6-21 15:44 发表
在写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;