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

回答