MVC 3: диспетчеру транзакций MSDTC не удалось извлечь транзакцию из источника

Я использую MVC 3 с сущностями, теперь я использовал нижеприведенную строку кодов с моего контроллера

        using (var scope = new TransactionScope())
        {
            _myRepository.DeleteFM1(id);
            _myRepository.DeleteFM2(id, name);
            scope.Complete();
        }

и внутри DeleteFM2 метод, который является моим методом, определенным в классе сущности, выглядит следующим образом:

    public void DeleteFM2(int id, string name)
    {
        var data= _repositoryMD.Fetch().Where(mColl => mColl.Col1 == id);

        if (data!= null)
        {
                //insert here is giving some error MSDTC error !
                // here I prepare a message using the '**data**'
                _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);


                _repositoryMD.Attach(data);
                _repositoryMD.Delete(data);
                _repositoryMD.SaveChanges();
            }
        }
    }

и у меня есть отдельный класс, где я определил метод Insert как

   public bool Insert(string realName, string logMessage, string tableName, string changeType, DateTime dateTime)
    {
        var history = new History
        {
            ModifiedBy = realName,
            ChangeType = changeType,
            DateModified = dateTime,
            LogMessage = logMessage,
            TableName = tableName
        };

        _repositoryHistory.Add(history);
        _repositoryHistory.SaveChanges();

        return true;
    }

после вставки этой строки кода в вышеуказанный метод DeleteFM2

      _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);

Я получаю эту ошибку, без этой строки мой код работает просто отлично, я использовал эту строку во всех моих других методах, даже там, где я там использовал область транзакций, но я все еще не понимаю проблему здесь. Пожалуйста помочь. Спасибо

базовый поставщик не удалось открыть.

.Операции.TransactionManagerCommunicationException: Сбой связи с базовым менеджером транзакций. ---> Система.Во время выполнения.InteropServices.COMException: транзакция MSDTC диспетчеру не удалось извлечь транзакцию из исходной транзакции менеджер из-за проблем со связью. Возможные причины: брандмауэр присутствует, и у него нет исключения для процесса MSDTC, две машины не могут найти друг друга по именам NetBIOS или поддержка сетевых транзакций не включена для одного из двух менеджер транзакций. (Исключение из HRESULT: 0x8004D02B) в Система.Операции.Oletx.IDtcProxyShimFactory.ReceiveTransaction(Тип Uint32 propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionIsolationLevel& isolationLevel, ITransactionShim& transactionShim) at Система.Операции.TransactionInterop.GetOletxTransactionFromTransmitterpropigationtoken (Байт[] propagationToken) --- конец внутреннее исключение трассировки стека - в Система.Операции.TransactionInterop.GetOletxTransactionFromTransmitterpropigationtoken (Байт[] propagationToken) на Система.Операции.TransactionStatePSPEOperation.PSPEPromote (InternalTransaction tx) at Система.Операции.TransactionStateDelegatedBase.EnterState (InternalTransaction tx) at Система.Операции.EnlistableStates.Продвижение (InternalTransaction tx) в системе.Операции.Торговая операция.Promote () at Система.Операции.TransactionInterop.ConvertToOletxTransaction (Транзакция сделки) в Система.Операции.TransactionInterop.GetExportCookie (Транзакция транзакция, байт [] местонахождение) в Система.Данные.В sqlclient.SqlInternalConnection.GetTransactionCookie (Транзакция транзакция, байт [] местонахождение) в Система.Данные.В sqlclient.SqlInternalConnection.EnlistNonNull (Транзакция Техас) в системе.Данные.В sqlclient.SqlInternalConnection.Enlist (Транзакция tx) at Система.Данные.В sqlclient.SqlInternalConnectionTds.Активировать (Транзакция сделки) в Система.Данные.ProviderBase.DbConnectionInternal.ActivateConnection (Транзакция сделки) в Система.Данные.ProviderBase.DbConnectionPool.Метод Getconnection(DbConnection И owningObject) на Система.Данные.ProviderBase.DbConnectionFactory.Метод Getconnection(DbConnection И owningConnection) на Система.Данные.ProviderBase.DbConnectionClosed.Содержащие Вредоносные Элементы(DbConnection И outerConnection, DbConnectionFactory connectionFactory) в Система.Данные.В sqlclient.Объект sqlconnection.Открыть() на Система.Данные.поставщик EntityClient.Объекты entityconnection.OpenStoreConnectionIf (Логическое Значение openCondition, dbConnection и storeConnectionToOpen, dbConnection и originalConnection, строка exceptionCode, строка attemptedOperation, Boolean& closeStoreConnectionOnFailure)

My FireWall settings

Мои настройки брандмауэра

6 ответов


ошибка означает, что MSDTC либо не работает на сервере базы данных, содержащем базу данных, которая _repositoryHistory цели; или что существует сетевая проблема, препятствующая распространению транзакции на эту машину.

убедитесь, что MSDTC установлен и запущен на сервере базы данных.

проверьте, работает ли Брандмауэр Windows на целевом сервере; если это так, проверьте исключения брандмауэра для MSDTC. Эта ссылка помогает в этом: http://technet.microsoft.com/en-us/library/cc725913 (v=ws.10).aspx


Я также столкнулся с этой ошибкой, хотя конфигурация, брандмауэры и netbios/dns были настроены правильно. Два сервера в моей настройке были клонами друг друга, поэтому MSDTC на каждом сервере имел одно и то же значение CID, что делает их неспособными взаимодействовать.

вот некоторые другие вещи, чтобы думать о При устранении неполадок MSDTC http://msdn.microsoft.com/en-us/library/aa561924.aspx Моя ситуация описана в разделе убедитесь, что MSDTC присвоен уникальный Значение CID

функция MSDTC операционной системы Windows требует уникального CID значения для обеспечения работы функций MSDTC между компьютерами правильно. Дубликаты дисков установок Windows должны иметь уникальные значения CID или функциональность MSDTC могут быть нарушены. Это может возникнуть при использовании виртуальных жестких дисков для развертывания операционной системы виртуальная машина.

чтобы определить, если msdtc значения CID для компьютеров, которые запуск Операционная система Windows уникальна, проверьте значения для записей под разделом реестра HKEY_CLASSES_ROOT\CID на обоих компьютерах. Если эти значения не являются уникальными для каждого компьютера, затем следуйте инструкциям раздел рассматривает возможность переустановки распределенной транзакции Услуги координатора, если другие действия по устранению неполадок не удалось переустановить MSDTC на одном из компьютеров, который затем будет генерировать уникальные значения CID MSDTC для этого компьютера и размещения правильное службу msdtc оперативный.

для сброса CIDs на сервере Windows 2012 используйте следующий сценарий Powershell:

#View: CIDs (These must be different on all systems)
ls Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | select Name


#reinstall MSDTC to regenerate CIDs. 
msdtc -uninstall
sleep 5
msdtc -install
sleep 5
Set-Service msdtc -startuptype "auto"
#then reboot for changes to take effect

использовать DTCPing для устранения ошибок, связанных с DTC. Это был инструмент go to для меня в течение многих лет для устранения неполадок распределенных транзакций в нашей системе.


попробовав все остальное здесь, я должен был добавить службу DTC (MSDTC.EXE) к моему брандмауэру.
Настройки брандмауэра по умолчанию для "Координатор Распределенных Транзакций" С помощью "%SystemRoot%\system32\svchost.exe".
Добавление нового правила с помощью координатор msdtc.EXE исправлены проблемы.


попробуйте перезапустить пул приложений веб-приложения MVC. Я испытал эту проблему, и нашел это, чтобы помочь немедленно.


У меня была такая же проблема в течение нескольких недель. У нас есть два веб-сервера (Win 2012) и один сервер БД (Win 2008). Оказывается, включение опции "без аутентификации" для безопасности решило нашу проблему.

CIDs: все разные на каждом сервере Доступ к сети MSDTC: включен Удаленный доступ MSDTC: включен Удаленный администратор MSDTC: отключен MSDTC нет аутентификации: включено

теперь он работает правильно в ферме серверов.