Вопрос по sql-server, msdtc, asp.net-mvc-3, entity-framework – MVC 3: диспетчеру транзакций MSDTC не удалось получить транзакцию из источника

12

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

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

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

<code>    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();
            }
        }
    }
</code>

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

<code>   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;
    }
</code>

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

<code>      _repositoryHistory.Insert(name, message, "FM2", "Delete", dateTime);
</code>

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

The underlying provider failed on Open.

System.Transactions.TransactionManagerCommunicationException: Communication with the underlying transaction manager has failed. ---> System.Runtime.InteropServices.COMException: The MSDTC transaction manager was unable to pull the transaction from the source transaction manager due to communication problems. Possible causes are: a firewall is present and it doesn't have an exception for the MSDTC process, the two machines cannot find each other by their NetBIOS names, or the support for network transactions is not enabled for one of the two transaction managers. (Exception from HRESULT: 0x8004D02B) at System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier, Guid& transactionIdentifier, OletxTransactionIsolationLevel& isolationLevel, ITransactionShim& transactionShim) at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken) --- End of inner exception stack trace --- at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken) at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx) at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx) at System.Transactions.EnlistableStates.Promote(InternalTransaction tx) at System.Transactions.Transaction.Promote() at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction) at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts) at System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts) at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx) at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)

My FireWall settings

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

Я обновил код сейчас Yasser
эти два хранилища & apos; базы данных на одном сервере? Andras Zoltan

Ваш Ответ

6   ответов
4

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

Согласитесь полностью. DTCPing позволил мне увидеть, что CID был дублирован
Не могу рекомендовать эту утилиту достаточно!
6

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

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

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

убрать звонокDeleteFM1 - делаетDeleteFM2 работать тогда?
и это всегда в сочетании с использованием_repositoryMD? Связь MSDTC должна быть в состоянии работать между серверами, на которых работают эти две базы данных
Я удалил вызов DeleteFM1 все еще та же ошибка Yasser
У меня есть только одна база данных ... Yasser
Я следовал вашему совету (см. Обновленный скриншот в вопросе), я использую эту _repositoryHistory во многих разных местах, это фактически для регистрации, когда есть обновление / вставка / удаление. Я использовал его более чем в 50 других местах, и там он отлично работает, я даже использовал его в том же классе, где этот метод DeleteFM2 (). Это не работает только для этого. Yasser
0

испытал эту проблему, и нашел это, чтобы помочь немедленно.

15

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

Вот некоторые другие вещи, которые следует учитывать при устранении неполадок MSDTC http://msdn.microsoft.com/en-us/library/aa561924.aspx Моя ситуация описана вEnsure that MSDTC is assigned a unique CID value

The MSDTC feature of the Windows operating system requires unique CID values to ensure that MSDTC functionality between computers works correctly. Disk duplicate images of Windows installations must have unique CID values or MSDTC functionality may be impaired. This can occur when using virtual hard disks to deploy an operating system to a virtual machine.

To determine if MSDTC CID values for computers that are running the Windows operating system are unique, check the values for the entries under the HKEY_CLASSES_ROOT\CID registry key on both computers. If these values are not unique for each computer then follow the steps in the section Consider reinstalling the Distributed Transaction Coordinator service if other troubleshooting steps are not successful to reinstall MSDTC on one of the computers, which will then generate unique MSDTC CID values for that computer and accommodate proper MSDTC operations.

Чтобы сбросить 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 четко сказал "Дублированный CID"
0

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

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

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

2

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

Если это продолжение какого-то существующего ответа, лучше отредактировать сообщение & amp; поставить эту информацию, а не публиковать в качестве другого ответа.

Похожие вопросы