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