WCF msmq 事务和工作单元

Posted

技术标签:

【中文标题】WCF msmq 事务和工作单元【英文标题】:WCF msmq transactioned and unit of work 【发布时间】:2014-06-18 09:24:03 【问题描述】:

我构建了一个事务性的 MSMQ WCF 服务。我在操作中使用了以下属性:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]

我在服务中使用 Nhibernate。使用 Nhibernate,我在我的会话中提交了一个提交。如果我禁用 Nhibernate 提交,则消息会被正确处理并从队列中删除。有了这个提交,Nhibernate 事务正常进行,但我的消息进入重试队列。

这是我进入 Nhibernate 服务跟踪的例外情况。

Description Handling an exception. Exception details: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
   at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
   at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
   at System.Transactions.TransactionScope.PushScope()
   at System.Transactions.TransactionScope.Initialize(Transaction transactionToUse, TimeSpan scopeTimeout, Boolean interopModeSpecified)
   at System.Transactions.TransactionScope..ctor(Transaction transactionToUse, TransactionScopeAsyncFlowOption asyncFlowOption)
   at System.Transactions.TransactionScope..ctor(Transaction transactionToUse)
   at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
   --- End of inner exception stack trace ---
   at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
   at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
   at System.Transactions.CommittableTransaction.Commit()
   at System.ServiceModel.Dispatcher.TransactionInstanceContextFacet.Complete(Transaction transaction, Exception error)

似乎休眠提交破坏了 WCF 上的事务。我找不到解决此问题的方法。

任何帮助都将不胜感激

【问题讨论】:

您是在调用 NH 同步还是异步(TPL?)? 在 WCF 服务中它是同步的。 (WCF 调用,调用后端类 -> 调用存储库。)后端类中的所有内容都在一个完整的 NH 事务中。 你试过这个答案吗:***.com/questions/4930175/…? 我们需要您的更多代码,因为事务对象在提交之前已经被释放。“无法访问释放的对象。对象名称:'事务'。” 为什么需要显式调用commit? NHibernate 将使用任何环境可用事务,但事务的范围是服务器之一,也就是说,我认为您不应该调用 commit。 【参考方案1】:

我对这些系统不太熟悉,但最简单的答案通常是正确的,所以我会试一试 - 猜测一下,我会说你调用这些项目的任何服务是在有机会删除项目之前停止删除项目的进程,因此我会在您调用项目的服务中添加某种函数调用,以便在完成之前强制从列表中删除项目交易。

当然,我不熟悉这个话题,所以不要相信我的话——这只是我通常会在我的编程知识范围内解决类似问题的方法。

【讨论】:

以上是关于WCF msmq 事务和工作单元的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 WCF 的事务性 MSMQ 中将消息显式标记为中毒

MSMQ 事务性消息传递如何工作?

将 MSMQ 端到端跟踪与 WCF 跟踪和应用程序级日志记录相关联

进行事务处理时消息未到达 MSMQ

WCF 通过 MSMQ 到 WCF 请求和响应

MSMQ 在 Azure 上是不是可用