標籤:
原帖由
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 |
[Oracle][ODBC SQL Server Driver][SQL Server]對象名 'RECOVER.HS_TRANSACTION_LOG' 無效(轉)