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

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

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

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

    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);

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

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

System.Transactions.TransactionManagerCommunicationException: сбой связи с базовым менеджером транзакций. ---> System.Runtime.InteropServices.COMException: диспетчеру транзакций MSDTC не удалось получить транзакцию из исходного менеджера транзакций из-за проблем со связью. Возможные причины: брандмауэр присутствует и у него нет исключения для процесса MSDTC, две машины не могут найти друг друга по их именам NetBIOS, или поддержка сетевых транзакций не включена для одного из двух менеджеров транзакций. (Исключение из HRESULT: 0x8004D02B) в System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, байт [] propgationToken, IntPtr managedIdentifier, Guid& transactionIdentifier, OletxTransactionIsolationLevel& IsolationLevel, ITransactionShim& transactionShim) при System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(байт [] spreadationToken) --- Конец трассировки стека внутренней исключительной ситуации --- в System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] пропаганда Token) в System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx) в System.TaseTaseTransTaction.TactionTlegTaction tx) в System.Transactions.EnlistableStates.Promote(InternalTransaction tx) в System.Transactions.Transaction.Promote() в System.Transactions.TransactionInterop.ConvertToOletxTransaction(транзакция транзакции) в System.Transactions.TransactionInterop.GetExportCookie(транзакция транзакции, местонахождение Byte []) в System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie (транзакция транзакции, Byte[] whereAbouts) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNata. at. SqlClient.SqlInternalConnection.Enlist (Транзакция tx) в System.Data.SqlClient.SqlInternalConnectionTds.Activate(Транзакция транзакции) в System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Транзакция транзакции) в System.Data.bjectBConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnectionConnect)...EntityConnection.OpenStoreConnectionIf (логическое openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String предпринять-операция, логическое и closeStoreConnectionOnFailure)

Мои настройки FireWall

Мои настройки FireWall

6 ответов

Решение

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

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

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

Я также столкнулся с этой ошибкой, хотя config, firewalls и 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.

Чтобы сбросить CID на Windows 2012 Server, используйте следующий скрипт 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. В течение многих лет я использовал этот инструмент для устранения неполадок, связанных с записями распределенных транзакций в нашей системе.

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

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

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

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

У меня была такая же проблема, и в моем случае проблема была решена при включении Без аутентификации в настройках MSDTC.

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

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