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)
据我所知[无法实现此目的](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
谢谢Michael。 我注意到这两个线程在我的搜索答案。让我感到困惑的是,它在调试模式下从Visual Studio运行系统时起作用。这就是让我相信这确实是可能的。 – Dorana 2014-10-10 12:19:42
在侧面说明。经过一些本地故障跟踪和测试看起来,在Visual Studio上运行时,它甚至没有使用DTC,这对我来说更是令人困惑。我在开发环境中停止了DTC服务,并且功能仍然有效。与更新两个实体一起工作,如果ExportGroups调用引发异常,它将处理数据库的回滚 – Dorana 2014-10-10 12:25:23