簡體   English   中英

無法執行該操作,因為鏈接服務器的 OLE DB 提供程序“SQLNCLI11”無法開始分布式事務

[英]The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server was unable to begin a distributed transaction

我正在嘗試從我的機器(SQL Server 2012)到客戶端服務器(SQL Server 2008)運行分布式事務。

我正在嘗試運行:

begin distributed transaction
select * from [172.01.01.01].master.dbo.sysprocesses
Commit Transaction

我得到:

OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 2
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" was unable to begin a distributed transaction.

我可以向該服務器運行 SELECT 並返回數據,所以至少我知道服務器可以看到彼此,並且鏈接服務器存在並且正在運行

現在,web 上有多個帖子,但我無法讓它工作。 到目前為止,這是我嘗試過的:

  1. 將 DTC 屬性設置為以下內容(在兩台服務器上)在此處輸入圖像描述

  2. 從控制面板 -> 服務(在兩台服務器上)重新啟動分布式事務處理協調器 (MSDTC)。

  3. 卸載並安裝 DTC(在兩台服務器上)。

  4. 重新啟動遠程服務器。

  5. 關閉兩台服務器上的防火牆。

  6. 啟用 sp_configure 'Ad Hoc Distributed Queries', 1(在兩台服務器上)。

  7. 我運行了 DTCPing,它 ping 成功了。

  8. 鏈接服務器屬性更改為以下內容: 在此處輸入圖像描述

還有什么可以嘗試的?

更新:運行從另一台服務器到 172.01.01.01 的事務。 因此問題不在目標服務器上,而是在我的源機器上。

將“啟用分布式事務推廣”標志設置為 false(在鏈接服務器屬性窗口中)解決了我的類似問題。

我遇到了類似的問題,並按如下方式解決了它。 SQL Server 中對象資源管理器的樹結構中有一個節點。 在那里你會找到 Serverobjects → LinkedServers → 下面是分布式服務器的 IP 地址列表。

右鍵單擊它,選擇屬性,會彈出一個窗口。 在左窗格中選擇服務器選項; 您將獲得屬性列表。 將標志值 false 設置為屬性“啟用分布式事務的提升”。

如果根據 OP 的原始帖子在兩個 SQL 服務器上配置了 MS 分布式事務協調器 (MSDTC) 后,您仍然“沒有活動的事務”,您應該檢查每個主機是否可以通過 IP 訪問(假設這是您的使用)在鏈接服務器中注冊。

例如; 在最近的設置中,可以通過 192.168.200.x 范圍內的網絡(同一子網)訪問兩個 SQL 服務器,但每台服務器也通過 10.xxx 范圍內的 IP 間接連接。 在一台 SQL Server 上,它使用的 DNS 服務器一直將目標 SQL Server 解析為它的 10.xxx IP(防火牆),即使鏈接服務器條目使用目標服務器的 192.168.200.x 中的 IP。

似乎 MSDTC 使用服務器的主機名,而 SQL 服務器使用鏈接服務器條目中定義的 IP 或主機名通過任何鏈接連接進行連接,導致在 SQL Management Studio 中檢查目標鏈接服務器時出現這種明顯連接的混淆行為,但無法在目標上執行遠程過程。

解決方案是在主機文件的 (%windir%\\system32\\drivers\\etc\\hosts) 中添加條目,以明確強制每個 SQL 服務器將另一個解析為 192.168.200.x 網絡上的 IP 地址。

在主機 1(IP 192.168.200.15 )上:

# TARGET SERVER
192.168.200.20    targetserverhostname.and.any.domain.suffix  targetserverhostname

在主機 2 上(IP 192.168.200.20

# SOURCE SERVER
192.168.200.15    sourceserverhostname.and.any.domain.suffix sourceserverhostname

不要忘記確保已根據上面 OP 的屏幕截圖配置了 MSDTC,允許網絡訪問和(如果需要)無身份驗證。

在開始分布式事務上方嘗試此 SQL

set XACT_ABORT on

我有一個類似的問題。 經歷了所有列出的事情都無濟於事。 我們有一個集群環境,結果我們的 DBA 在集群上而不是在主服務器上執行服務工作。 如果所有其他方法都失敗了,請記住這一點:-)

像這樣的情況可能會導致同樣的錯誤:

1- 運行這樣的事務腳本並從鏈接服務器讀取:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Begin Tran
... (select command from linked server)...
Commit

2- 在代碼中打開一個新連接並運行一個非事務性腳本

結果:將引發錯誤!

解決方案:刪除SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

修復:確保鏈接服務器屬性上的“啟用分布式事務處理”設置為“False”。

EXEC master.dbo.sp_serveroption @server=N'yourlinkedservername', @optname=N'remote proc transaction promotion', @optvalue=N'true'

“remote proc transaction promotion”是 SQL Server 2008 上的一個新選項,它允許您控制是否要在分布式事務中啟用遠程存儲過程調用。 當這個選項關閉時(FALSE),本地事務不會被提升為分布式事務。 這就是我們能夠以“自主交易”方式分離外部和內部交易的方式。

來源: https://www.eugenechiang.com/2020/09/17/linked-server-error-no-transaction-is-active/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM