【问题标题】:WCF with MSMQ DTC - closing NHibernate sessionsWCF 与 MSMQ DTC - 关闭 NHibernate 会话
【发布时间】:2012-11-10 05:43:55
【问题描述】:

我有一个 WCF MSMQ 服务(托管在 Windows 服务中)。我的方法上有 TransactionScopeRequired 属性。

我正在使用 Nhibernate 将我的数据保存到我的数据库中。我想确保在每次通话后关闭每个 Nhibernate 会话。

我在数据访问中使用了以下方法(使用城堡设施)

using(var session = sessionManager.OpenSession())
using(var transaction = session.BeginTransaction())
{

 // do work
transaction.Commit()

}

但是当我的主要服务方法退出时,我收到了一个错误,因为我已经处理了 Nhibernate 会话,并且我认为 DTC 需要它来执行它的提交。

我的问题是:

关闭 Nhibernate 会话的最佳方式是什么 - 在 DTC 提交之后(即在我退出服务方法之后?)。

谢谢。

【问题讨论】:

  • 您使用的方法应该可以,但您没有说明错误消息或 NHibernate 版本。

标签: wcf nhibernate msmq netmsmqbinding


【解决方案1】:

如果您将代码包装在以下内容中

using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
     // code here 
     sc.Complete(); 
} 

然后 NHibernate 将不会在环境事务中登记,因此 DTC 将不会依赖于数据库事务。

这是一种预感,因为您没有在问题中提供错误详细信息。

编辑

当然,通过遵循这个建议,您的数据库提交将不会在与出队操作相同的事务下执行,因此如果您的数据库出现故障,这可能会或可能不会导致出队事务将正在处理的消息回滚到队列,因此您可能会以这种方式丢弃消息。您可以通过各种方式对此进行补偿,或者如果丢失消息的成本不高,您可以冒险。

【讨论】:

  • 您好,很抱歉耽搁了。哇休很好的答案。你的修复在最后一分钟救了我的培根!非常感谢。 (我会在星期一回来工作时添加错误消息。)
  • 但大概如果 nhibernate transaction.Commit() 炸毁了我的 try catch 将阻止我到达 scope.Complete - 所以我应该没问题?
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多