Связанный сервер 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

и он возвращает ошибку:

Поставщик OLE DB "SQLNCLI" для связанного сервера "LIVE" вернул сообщение "Невозможно запустить больше транзакций в этом сеансе".
Сообщение 7395, уровень 16, состояние 2, строка 3
Невозможно запустить вложенную транзакцию для поставщика OLE DB "SQLNCLI" для связанного сервера "LIVE". Требовалась вложенная транзакция, поскольку для опции 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)

1 ответ

Решение

Из документацииSET XACT_ABORT:

XACT_ABORT должен быть включен для операторов изменения данных в неявной или явной транзакции против большинства поставщиков OLE DB, включая SQL Server. Единственный случай, когда этот параметр не требуется, - это если поставщик поддерживает вложенные транзакции."

Возможно, вы использовали поставщика, который поддерживал вложенные транзакции в 2000 году. Похоже, вам нужно установить XACT_ABORT, Не уверен, что это соответствует тому, что делает ваш рабочий код.

Этот ответ может помочь: в чем преимущество использования "SET XACT_ABORT ON" в хранимой процедуре?

Другие вопросы по тегам