web-dev-qa-db-ja.com

MVC 3:MSDTCトランザクションマネージャーはソースからトランザクションをプルできませんでした

エンティティでMVC 3を使用していますが、コントローラーから次のコード行を使用しました

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

そして、Entityクラスで定義された私のメソッドであるmy 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);

このエラーが発生します。この行がないとコードは問題なく機能します。トランザクションスコープを使用していた場合でも、他のすべてのメソッドでこの行を使用しましたが、まだ問題を理解していないようです。助けてください。ありがとう

基になるプロバイダーがOpenで失敗しました。

System.Transactions.TransactionManagerCommunicationException:基になるトランザクションマネージャーとの通信に失敗しました。 ---> System.Runtime.InteropServices.COMException:通信の問題により、MSDTCトランザクションマネージャーはソーストランザクションマネージャーからトランザクションをプルできませんでした。考えられる原因は次のとおりです。ファイアウォールが存在し、MSDTCプロセスの例外がない、2台のマシンがNetBIOS名でお互いを検出できない、または2つのトランザクションマネージャのいずれかでネットワークトランザクションのサポートが有効になっていない。 (HRESULTからの例外:0x8004D02B)System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize、Byte [] propgationToken、IntPtr managedIdentifier、Guid&transactionIdentifier、OletxTransactionITransationActionTransmactionTransmactionTransactionSimactionTransactionSimactionTransactionSimactionTransactionSimactionTransactionSimactionTransactionSimactionTransactionSimactionTransactionSymaction伝搬トークン)---内部例外スタックトレースの終了--- at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte [] propagationToken)at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)System.Transactions.EnlistableStates.Promote(InternalTransaction tx)at System.Transactions.Transaction.Promote()at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)at System.Transactions.TransactionInte System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction、Byte [] whereAbouts)のSystem.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)のSystem.Data。でのrop.GetExportCookie(Transaction transaction、Byte [] whereabouts) 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 )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 ori ginalConnection、String exceptionCode、String attemptedOperation、Boolean&closeStoreConnectionOnFailure)

My FireWall settings

ファイアウォールの設定

14
Yasser Shaikh

エラーは、MSDTCが、_repositoryHistoryが対象とするデータベースを含むデータベースサーバーで実行されていないことを意味します。または、そのマシンへのトランザクションの伝播を妨げるネットワークの問題がある。

MSDTCがデータベースサーバーにインストールされ、実行されていることを確認します。

ターゲットサーバーでWindowsファイアウォールが実行されているかどうかを確認します。そうである場合は、MSDTCのファイアウォールの除外を確認してください。このリンクはそれを助けます: http://technet.Microsoft.com/en-us/library/cc725913(v = ws.10).aspx

7
Andras Zoltan

構成、ファイアウォール、netbios/dnsが正しく設定されていても、このエラーが発生しました。私のセットアップの2つのサーバーは相互のクローンだったので、各サーバーのMSDTCは同じCID値を持っていたため、相互運用できなくなりました。

MSDTCのトラブルシューティングを行う際に考慮すべきその他の事項を以下に示します http://msdn.Microsoft.com/en-us/library/aa561924.aspx 私の状況はMSDTCに一意のCID値が割り当てられていることを確認します

WindowsオペレーティングシステムのMSDTC機能では、コンピューター間のMSDTC機能が正しく機能するために、一意のCID値が必要です。 Windowsインストールのディスク複製イメージには一意のCID値が必要です。そうでない場合、MSDTC機能が損なわれる可能性があります。これは、仮想ハードディスクを使用してオペレーティングシステムを仮想マシンに展開するときに発生する可能性があります。

Windowsオペレーティングシステムを実行しているコンピューターのMSDTC CID値が一意であるかどうかを確認するには、両方のコンピューターのHKEY_CLASSES_ROOT\CIDレジストリキーの下のエントリの値を確認します。これらの値がコンピューターごとに一意でない場合は、他のトラブルシューティング手順でいずれかのコンピューターにMSDTCを再インストールできない場合、「Distributed Transaction Coordinatorサービスの再インストールを検討する」の手順に従って、そのコンピューターに固有のMSDTC CID値を生成します。適切なMSDTC操作に対応します。

Windows 2012 ServerでCIDをリセットするには、次の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
15
JeremyWeir

DTCPing を使用して、DTC関連のエラーのトラブルシューティングを行います。これは、私たちのシステムで分散トランザクションの書き込みをトラブルシューティングするための、私にとって長年の道のりでした。

5
wonster

ここで他のすべてを試した後、ファイアウォールにDTCサービス(MSDTC.EXE)を追加する必要がありました。
"Distributed Transaction Coordinator"のデフォルトのファイアウォール設定は"%SystemRoot%\system32\svchost.exe"を使用していました。
MSDTC.EXEを使用して新しいルールを追加すると、問題が修正されました。

2
TheTall

私は数週間前から同じ問題を抱えていました。 2つのWebサーバー(Win 2012)と1つのDBサーバー(Win 2008)があります。セキュリティのために「認証なし」オプションを有効にすると、問題が解決したことがわかります。

CID:サーバーごとにすべて異なるMSDTCネットワークアクセス:有効MSDTCリモートアクセス:有効MSDTCリモート管理:無効MSDTC認証なし:有効

これで、サーバーファームで正しく動作します。

1
Jacob Anderson

指定されたMVC Webアプリケーションのアプリケーションプールをリサイクルしてください。私はこの問題を経験し、すぐに役立つことがわかりました。

0
Atique

同じ問題がありましたが、私の場合、MSDTC設定で[認証なし]を有効にすると問題が解決しました。

0
umer