Sql-Server

SQL Server 連結伺服器:“無法在此會話上啟動更多事務。”

  • May 6, 2020

我正在嘗試INSERT對連結伺服器執行操作:

DBCC TRACEON (3604, 7300)

BEGIN TRANSACTION

INSERT INTO LIVE.Contoso.dbo.Events (EventGUID, EventDate, LoginGUID, UserGUID, EventType, Notes, TargetGUID) 
VALUES ('{494D023F-CD5A-11E2-9F18-C86000D0B92A}', getdate(), '{3B4F90C0-CD5A-11E2-9F18-C86000D0B92A}', '{494D023D-CD5A-11E2-9F18-C86000D0B92A}', 1, N'Test notes', '{494D023E-CD5A-11E2-9F18-C86000D0B92A}')

ROLLBACK TRANSACTION

它返回錯誤:

連結伺服器“LIVE”的 OLE DB 提供程序“SQLNCLI”返回消息“無法在此會話上啟動更多事務。”。

消息 7395,級別 16,狀態 2,第 3 行

無法為連結伺服器“LIVE”啟動 OLE DB 提供程序“SQLNCLI”的嵌套事務。因為 XACT_ABORT 選項設置為 OFF,所以需要嵌套事務。

這個本地數據庫從 2000 年(查詢工作的地方)移到了 2005 年(查詢沒有工作的地方)。遠端伺服器是 2008 R2。

你試過什麼?

我兩年前問的這個問題的詳盡清單。

您是如何創建連結伺服器的?

--EXEC master.dbo.sp_dropserver @server = N'LIVE'
EXEC master.dbo.sp_addlinkedserver @server = N'LIVE', @srvproduct=N'', @provider=N'SQLOLEDB', @datasrc=N'vader'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LIVE', @locallogin = NULL, @useself = N'False', @rmtuser = N'Contoso', @rmtpassword = N'Battery Horse Staple Correct'

但是你試過什麼?

  • 我禁用了兩台伺服器上的所有 MSDTC 安全選項

在此處輸入圖像描述

  • 檢查時鐘是否同步(如果它們不同步,由於某種未知的原因會破壞各種身份驗證方案)

在此處輸入圖像描述

  • 我在兩台伺服器上都禁用了防火牆(沒有截圖;你必須相信我)
  • 離開重新加入域

伺服器的版本是多少?

  • 本地Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
  • 連結遙控器Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

以下文件SET XACT_ABORT

對於大多數 OLE DB 提供程序(包括 SQL Server)的隱式或顯式事務中的數據修改語句,XACT_ABORT 必須設置為 ON。唯一不需要此選項的情況是提供程序支持嵌套事務。”

也許您在 2000 上使用了支持嵌套事務的提供程序。似乎您需要設置XACT_ABORT. 不確定這是否符合您的生產程式碼正在執行的操作。

這個答案可能會有所幫助:在儲存過程中使用“SET XACT_ABORT ON”有什麼好處?

引用自:https://serverfault.com/questions/513422