1

我看到其他類似的問題,但我還沒有找到一個工作解決方案。生產環境中的transactionScope和ServiceBus問題

我在調用Database和ServiceBus時使用了一個事務。

我爲我的數據庫使用了UnitOfWork/EntityFramework。

這裏是我的代碼

/*Creating the list and adding to UnitOfWork repository*/ 
.... 
using (TransactionScope scope = new TransactionScope()) 
     { 
      _unitOfWork.Save(); 
      ExportGroups(myGroupList); 
      scope.Complete(); 
     } 

這裏是一個片段從ExportGroups功能

public void ExportGroups(IEnumerable<Group> groups) 
{ 
    /*Generating BrokeredMessage message*/ 
    Task.Factory.StartNew(() => 
     { 
      MessagingFactory factory = CreateMessagingFactory(...); 
      if (factory != null) 
      { 
       var sender = factory.CreateMessageSender(topicName); 
       sender.Send(message); 
      } 
     }).Wait(); 

} 

這個工程沒有在我的開發環境中的任何問題。但是,當我們投入生產時,出現以下錯誤

「System.InvalidOperationException:本地事務不受其他資源管理器/ DTC支持。」

DTC在機器上啓用,我們用它來處理其他事務,雖然他們都沒有使用ServiceBus。

[編輯=新增堆棧跟蹤]

Server stack trace: 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpResourceManager.EnlistAsyncResult..ctor(SbmpResourceManager resourceManager, Transaction transaction, IRequestSessionChannel channel, SbmpMessageCreator messageCreator, Action`1 partitionInfoSetter, TimeSpan timeout, AsyncCallback callback, Object state) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpResourceManager.BeginEnlist(Transaction transaction, IRequestSessionChannel channel, SbmpMessageCreator messageCreator, Action`1 partitionInfoSetter, TimeSpan timeout, AsyncCallback callback, Object state) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpTransactionalAsyncResult`1.<>c__DisplayClass3e.<GetAsyncSteps>b__38(TIteratorAsyncResult thisPtr, TimeSpan t, AsyncCallback c, Object s) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.EnumerateSteps(CurrentThreadType state) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.Start() 

Exception rethrown at [0]: 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.OnEndSend(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.EnumerateSteps(CurrentThreadType state) 

Exception rethrown at [1]: 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.RunSynchronously() 
    at Microsoft.ServiceBus.Messaging.MessageSender.Send(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout) 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at System.Threading.Tasks.Task.Wait() 
    at ....GroupService.ExportGroups(IEnumerable<Group> groups) 
+0

據我所知[無法實現此目的](http://stackoverflow.com/a/15528668/997668)(請參閱**更新**下的部分答案)。服務總線[不支持DTC](https://social.msdn.microsoft.com/Forums/azure/en-US/817c325e-b439-49ac-aec8-98c0c7c83cc0/local-transactions-are-not-supported-與-其他資源,managersdtc?論壇= servbus)。如果您使用的是Windows Azure,則可以使用[此方法](http://geekswithblogs.net/asmith/archive/2012/04/02/149176.aspx) – Michael 2014-10-10 12:07:31

+0

謝謝Michael。 我注意到這兩個線程在我的搜索答案。讓我感到困惑的是,它在調試模式下從Visual Studio運行系統時起作用。這就是讓我相信這確實是可能的。 – Dorana 2014-10-10 12:19:42

+0

在側面說明。經過一些本地故障跟蹤和測試看起來,在Visual Studio上運行時,它甚至沒有使用DTC,這對我來說更是令人困惑。我在開發環境中停止了DTC服務,並且功能仍然有效。與更新兩個實體一起工作,如果ExportGroups調用引發異常,它將處理數據庫的回滾 – Dorana 2014-10-10 12:25:23

回答