我有一個多線程調度程序進程(.NET)調用存儲過程,需要從鏈接服務器提取數據並最終將數據插入到本地表。我沒有明確地使用任何交易 - 我不關心這個過程失敗,因爲我可以重新運行。此外,我想避免分佈式事務(MSDTC)的複雜性。當涉及鏈接服務器的查詢引發分佈式事務錯誤當沒有使用事務或需要時
我正在運行到的是,大部分通過.NET程序的時候,我收到以下錯誤:
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction.
OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "No transaction is active.
當我從SQL Server Management Studio中執行存儲過程,它沒有得到錯誤。我一直在試圖追蹤SSMS執行與.NET的不同之處,我發現一些實例是.NET進程沒有得到錯誤。但即使如此,我無法區分何時失敗與何時失敗。
對於它的價值,我把一些日誌記錄的程序,來記錄@@trancount
,它總是註冊爲2。我可以理解一個隱性事務覆蓋INSERT
語句來保存日誌,但我不能佔第二。對於它的價值,我的存儲過程實際上調用訪問鏈接服務器的第二個過程 - 不確定這是否相關。儘管如此,@@trancount
即使成功時也返回2(不管是否從SSMS或.NET調用)。
DBA已更改鏈接的服務器屬性以確保「啓用分佈式事務的提升」爲false。我還應該嘗試什麼?謝謝!
IIRC,這可能是LinkedServer定義的問題,或者與本地或遠程SQL Server上的MSDTC設置有關。我建議把它帶到hhtp://dba.stackexchange.com,那裏有更多的DBA可能知道詳細信息。 – RBarryYoung
此外,這個問題有很多有用的信息:https://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction – RBarryYoung
而這裏:https://stackoverflow.com/questions/18657768/ole-db-provider-sqlncli-for-linked-server-was-unable-to-begin-a-distributed-tr – RBarryYoung