Sql-Server

嘗試通過包含文本索引的連結更新 oracle 表時出現 DTC 超時

  • May 28, 2014

問題

給定的是一個連接到 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幫助。

引用自:https://dba.stackexchange.com/questions/62322