SQL Server链接的服务器:“无法在此会话上启动更多的事务”。

我想对链接的服务器执行一个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。

你有什么尝试?

这是我两年前问的这个问题的详尽清单。

你是如何创build链接服务器的?

 --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安全选项

    在这里输入图像说明

  • 检查时钟是否同步(如果它们不同步,则出于某种未知原因将破坏各种authenticationscheme)

    在这里输入图像说明

  • 我禁用了两台服务器上的防火墙(没有截图,你只能相信我)

  • 离开了重新join的领域

什么是服务器的版本?

  • 本地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”有什么好处?