MVC 3: Менеджер транзакций MSDTC не смог вытащить транзакцию из источника

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

        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, но я все еще не понимаю, как это понимать здесь, Пожалуйста помоги. Благодаря

Исходный провайдер не смог открыть Open.

System.Transactions.TransactionManagerCommunicationException: Не удалось связаться с основным менеджером транзакций. --- > System.Runtime.InteropServices.COMException: транзакция MSDTC менеджер не смог вытащить транзакцию из исходной транзакции из-за проблем с коммуникацией. Возможными причинами являются: брандмауэр присутствует и не имеет исключения для процесса MSDTC, две машины не могут найти друг друга по именам NetBIOS или поддержка сетевых транзакций не включена для одного из двух менеджеров транзакций. (Исключение из HRESULT: 0x8004D02B) в System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr managedIdentifier, Guid & Идентификатор транзакции, OletxTransactionIsolationLevel & isolLevel, ITransactionShim & transactionShim) в System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(байт [] propagationToken) --- Конец внутренней трассировки стека исключений --- at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(байт [] распространениеToken) в System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx) в System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx) в System.Transactions.EnlistableStates.Promote(InternalTransaction tx) в System.Transactions.Transaction.Promote() at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction транзакции) при System.Transactions.TransactionInterop.GetExportCookie(Transaction транзакция, байт [] местонахождение) в System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction транзакция, Byte [] whereAbouts) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) в System.Data.SqlClient.SqlInternalConnection.Enlist(транзакция tx) в System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction транзакции) при System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction транзакции) при System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection владеющий связью) при System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection externalConnection, DbConnectionFactory connectionFactory) при System.Data.SqlClient.SqlConnection.Open() at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String попыткаOperation, Логическое & closeStoreConnectionOnFailure)

My FireWall settings

Настройки My FireWall

Ответ 1

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

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

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

Ответ 2

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

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

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

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

В reset идентификаторы CID на сервере Windows 2012 Server используют следующую версию Powershell script:

#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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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