Не удалось начать распределенную транзакцию

Я пытаюсь запустить SQL со связанным сервером, но я получаю ошибки.

BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions


OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".

Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

Есть две ошибки, возвращенные поставщиком:

Ошибка # 1:

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile: 
HelpContext: $00000000
SQLState: 01000
NativeError: 7412

Ошибка # 2

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile: 
HelpContext: $00000000
SQLState: 42000
NativeError: 7391

Как заставить Microsoft поддерживать функциональность по безопасности?

Или, по крайней мере, как я могу заставить два SQL Severs разговаривать друг с другом?

Связанные вопросы


То, что я сделал, не имеет значения, но я все равно опубликую его.

  • Убедитесь, что служба Distributed Transaction Coordinator запущена на обеих машинах:

    enter image description here

    enter image description here

  • Отключите всю безопасность MSDTC на обеих машинах:

    введите описание изображения здесь

    enter image description here

  • Включите случайные параметры на связанном сервере:

введите описание изображения здесь

  1. Проклят и выругался.

  2. Разрушенные вещи.

  3. Проверено, что SELECT может использовать связанный сервер:

       SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
       ....
    
       (763 row(s) affected)
    
  4. Проверено, что клиентский сервер может ping удаленный сервер:

        C:\Documents and Settings\avatar>ping asicmstest.contoso.com
    
        Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data:
    
        Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
        Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
        Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
        Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
    
        Ping statistics for 10.0.0.40:
            Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
        Approximate round trip times in milli-seconds:
            Minimum = 0ms, Maximum = 0ms, Average = 0ms
    
  5. Проверено, что удаленный сервер может переписать по имени на исходный сервер:

        C:\Documents and Settings\avatar>ping asitestserver.contoso.com
    
        Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data:
    
        Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
        Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
        Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
        Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
    
        Ping statistics for 10.0.0.22:
            Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
        Approximate round trip times in milli-seconds:
            Minimum = 0ms, Maximum = 0ms, Average = 0ms
    
  6. Проверено, что @@SERVERNAME соответствует имени сервера на обоих серверах:

      SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
      -------------  -------------
      ASITESTSERVER  ASITESTSERVER
    

    и

      SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
      ----------  ----------
      ASIGROBTEST  ASIGROBTEST
    
  7. вскрикнула

  8. Выдано SET XACT_ABORT ON перед выдачей моего запроса:

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
    
  9. Предоставлено Everyone Full Control до:

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    на обоих серверах.

Ответ 1

Нашел его, MSDTC на удаленном сервере был клоном локального сервера.

В журнале событий приложений Windows:

Тип события: ошибка
Источник события: MSDTC
Категория события: CM
Код события: 4101
Дата: 19.09.2011
Время: 1:32:59 PM
Пользователь: N/A
Компьютер: ASITESTSERVER
Описание:

Локальный MS DTC обнаружил, что MS DTC на ASICMSTEST имеет тот же уникальный идентификатор, что и локальная MS DTC. Это означает, что два MS DTC не смогут общаться друг с другом. Эта проблема обычно возникает, если одна из систем были клонированы с использованием неподдерживаемых инструментов клонирования. MS DTC требует, чтобы системы клонируются с использованием поддерживаемых инструментов клонирования, таких как SYSPREP. Запуск "msdtc -uninstall", а затем "msdtc -install" из команды подсказка исправит проблему. Примечание. Запуск "msdtc -uninstall" будет приводят к потере всей информации о конфигурации MS DTC.

Для получения дополнительной информации см. Центр справки и поддержки по адресу http://go.microsoft.com/fwlink/events.asp.

Запуск

msdtc -uninstall
msdtc -install

а затем остановить и перезапустить службу SQL Server.

Ответ 2

ОК, поэтому запущены сервисы, между ними существует сетевой путь, работа по разрешению имен, работа с связанными серверами, и вы отключили аутентификацию транзакций.

В моей кишке говорится о проблеме с брандмауэром, но кое-что приходит на ум...

  • Являются ли машины в одном домене? (да, не имеет значения с отключенной аутентификацией).
  • Доступны ли брандмауэры на машинах? DTC может быть немного болен для брандмауэров, поскольку он использует ряд портов, см. http://support.microsoft.com/kb/306843. В настоящее время я отключу брандмауэры для для определения проблемы
  • Что скажет DTC ping? http://www.microsoft.com/download/en/details.aspx?id=2868
  • В какой учетной записи работает SQL-служба?

Ответ 3

Если серверы кластеризованы и есть кластерный DTC, вы должны отключить защиту от кластерного кода неисправности, а не локального кода DTC.

Ответ 4

Мне удалось решить эту проблему (как другие упоминали в комментариях), отключив "Включить продвижение распределенных транзакций для RPC":

enter image description here

Ответ 5

Если ваш целевой сервер находится в другом облаке или центре данных, вам необходимо добавить хост-запись службы MSDTC (целевого сервера) на исходном сервере.

Попробуйте это, если проблема не решена, после включения параметров MSDTC.

Ответ 6

Мое последнее приключение с MSDTC, и эта ошибка сегодня оказалась проблемой DNS. Вы на правильном пути спрашиваете, находятся ли компьютеры в одном домене, EBarr. Потрясающий список для этой проблемы, кстати!

Мое положение: мне нужен сервер в дочернем домене, чтобы иметь возможность запускать распределенные транзакции с сервером в родительском домене через брандмауэр. За последние годы я использовал связанные серверы, поэтому у меня были все обычные настройки в SQL для связанного сервера и в MSDTC, которые Ian документировал так красиво выше. Я установил MSDTC с несколькими портами TCP (5000-5200) для использования на обоих серверах и устроил межсетевой экран между ящиками для портов 1433 и 5000-5200. Это должно сработать. Связанный сервер протестировал ОК, и я мог запросить удаленный SQL-сервер через связанный сервер красиво, но я не мог заставить его разрешить распределенную транзакцию. Я даже мог видеть соединение на сервере QA с сервером DEV, но что-то не делало поездку назад.

Я мог бы PING сервер DEV из QA использовать полное доменное имя, например: PING DEVSQL.dev.domain.com

Я не мог PING сервер DEV только с именем машины: PING DEVSQL

Предполагалось, что сервер DEVSQL является членом обоих доменов, но имя не было разрешено в доменном DNS-домене... что-то случилось с машинной учетной записью для DEVSQL в родительском домене. Когда мы добавили DEVSQL в DNS для родительского домена, а "PING DEVSQL" работал с удаленного сервера QA, эта проблема была решена для нас.

Надеюсь, это поможет!

Ответ 7

Помимо настроек безопасности, мне пришлось открыть несколько портов на обоих серверах для выполнения транзакции. Мне пришлось открыть порт 59640, но согласно следующему предложению, порт 135 должен быть открыт. http://support.microsoft.com/kb/839279

Ответ 8

Я получил ту же ошибку, и мне удалось ее исправить, правильно настроив MSDTC на исходном сервере, чтобы разрешить исходящий и разрешить DTC через брандмауэр Windows.

Разрешить координатора распределенных транзакций, тиковый домен, частные и публичные параметры