2017-07-27 53 views
1

我有一個多線程調度程序進程(.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。我還應該嘗試什麼?謝謝!

+0

IIRC,這可能是LinkedServer定義的問題,或者與本地或遠程SQL Server上的MSDTC設置有關。我建議把它帶到hhtp://dba.stackexchange.com,那裏有更多的DBA可能知道詳細信息。 – RBarryYoung

+0

此外,這個問題有很多有用的信息:https://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction – RBarryYoung

+0

而這裏:https://stackoverflow.com/questions/18657768/ole-db-provider-sqlncli-for-linked-server-was-unable-to-begin-a-distributed-tr – RBarryYoung

回答

1

我首先發現了導致事務嘗試的原因(這是我的目標,因爲我不需要事務)。從鏈接服務器提取數據的過程是使用SELECT ... INTO #temp模式將該數據插入到#temp表中。由於它選擇的表是跨鏈接服務器,我相信它也在那裏創建臨時表。要麼,要麼它仍然在本地創建臨時表,但由於所選表是跨越鏈接服務器的,它試圖擴展事務(隱式到插入語句)以涵蓋本地服務器和鏈接服務器。

無論哪種方式,當我更改爲在INSERT ... SELECT語句之前的單獨語句中創建臨時表時,它的運行沒有錯誤!

這並不能解釋給我的是爲什麼程序會工作(每次通過SSMS,很少通過.NET)。我會根據不同的執行計劃以及SQL Server巫術魔法來粉飾它。

相關問題