原帖由
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;
终于把事务问题解决了,这个问题,如鲠在喉;困扰我半年了,如今客户的系统马上要正式使用;
我被迫又摸索了一把,终于搞定了:
解决方法:
1. 修改 initdg4msql.ora文件;
最后两行: HS_FDS_RECOVERY_ACCOUNT=RECOVER HS_FDS_RECOVERY_PWD=RECOVER 修改成
HS_FDS_RECOVERY_ACCOUNT=dbo HS_FDS_RECOVERY_PWD=sa的密码;
这个是最简单的方法,当然也可以在mssql 建立recover用户,我觉得还是越简单越好;
2. 在sqlserver 数据库上运行: DROP TABLE HS_TRANSACTION_LOG go
CREATE TABLE HS_TRANSACTION_LOG( GLOBAL_TRAN_ID char (64) NOT NULL, TRAN_COMMENT char (255) NULL ) go
grant all on HS_TRANSACTION_LOG to public go
这样一切都搞定了;再也不用担心两个数据库间事务切换的问题了; |
|
http://www.daizhicun.com
|
转载于:https://www.cnblogs.com/kingxiaozi/p/4832542.html