現在のプロジェクトでは、アプリケーションのデータ層として ADO.NET Entity Framework を使用しています。データベースで行う作業が多いため、トランザクションで実行する必要があるタスクがいくつかあります。これらのタスクを囲むためにTransactionScopeを使用しています。
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
// Do something...
transactionScope.Complete();
}
問題は、 TransactionScopeを使用するとすぐに例外が発生することです。
System.Data.EntityException: 基になるプロバイダーが Open で失敗しました。---> System.Transactions.TransactionManagerCommunicationException: 基になるトランザクション マネージャーとの通信に失敗しました。---> System.Runtime.InteropServices.COMException (0x80004005): COM コンポーネントの呼び出しからエラー HRESULT E_FAIL が返されました。
このエラーは、MSDTC (Microsoft Distributed Transaction Coordinator) で何らかの処理を行う必要があるようです。MSDTC のセキュリティ構成を変更すると、別の例外がスローされます。
System.Data.EntityException: 基になるプロバイダーが Open で失敗しました。---> System.Transactions.TransactionManagerCommunicationException: 分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。コンポーネント サービス管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスに対して DTC を有効にしてください。
ただし、MSDTC が構成されていると、TransactionScopeによってエラーが発生します。誰かがここで何がうまくいかないのか知っていますか?