Sql-Server
嘗試通過包含文本索引的連結更新 oracle 表時出現 DTC 超時
問題
給定的是一個連接到 ORACLE 實例的 SQL Server 作為連結伺服器。它使用 Oracle 客戶端 OLEDB 提供程序。當對具有 CTXSYS.CONTEXT 文本索引的表的事務進行更新時,DTC 連接在大約 1 分鐘後中止。10 分鐘
Error: 8522, Severity: 18, State: 1
送出。只要您刪除 CONTEXT 索引,它就會再次起作用。這是 OraOLEDB 中的一個錯誤,還是我們可以做些什麼來解決這個問題,同時保留索引?
設置
關於甲骨文
我們使用 ORACLE 11g 11.2.0.2.0
為此測試創建此表。
CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200)); INSERT INTO docs VALUES(1, '<HTML>California is a state in the US.</HTML>'); INSERT INTO docs VALUES(2, '<HTML>Paris is a city in France.</HTML>'); INSERT INTO docs VALUES(3, '<HTML>France is in Europe.</HTML>'); INSERT INTO docs VALUES(4, '<HTML>Los Angeles is a city in California.</HTML>'); INSERT INTO docs VALUES(5, '<HTML>Mexico City is big.</HTML>'); COMMIT; CREATE INDEX idx_docs ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
在 MSSQL 上
我們使用 SQL Server 2012 Express 和 Developer Edition 都產生相同的錯誤。使用 Oracle Provider for OLE DB (OraOLEDB) Release 12.1.0.1.0 Production 將連結伺服器設置到上述 Oracle Server。
複製
工作更新
此更新有效:
set xact_abort off; update DBLINK..REMOTE_USER.DOCS set text='<HTML>Mexico City is massive.</HTML>' where id = 5; (1 row(s) affected)
在 DTC 似乎超時執行後,此更新語句會產生錯誤。
set xact_abort on; begin transaction t1 update DBLINK..REMOTE_USER.DOCS set text='<HTML>Mexico City is huge.</HTML>' where id = 5; commit transaction t1; (1 row(s) affected) Msg 8522, Level 18, State 1, Line 4 Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.
痕跡
這是成功更新跟踪的結束:
這是執行到超時的更新跟踪的結束:
事實證明(在 Oracle SR 之後)這是一個已知問題,我們需要修補 Oracle 伺服器 ->
ORACLE 11G 11.2.0.2 PATCH 27 BUG FOR WINDOWS
幫助。