4

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

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

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

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

 // do work
transaction.Commit()

}

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

我的问题是:

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

谢谢你。

4

1 回答 1

3

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

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

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

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

编辑

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

于 2012-11-22T13:50:23.603 回答