使用MSMQ DTC的WCF - 关闭NHibernate会话

时间:2012-11-21 21:27:35

标签: wcf nhibernate msmq netmsmqbinding

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

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

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

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

 // do work
transaction.Commit()

}

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

我的问题是:

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

谢谢。

1 个答案:

答案 0 :(得分:3)

如果您将代码包装在以下

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

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

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

修改

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