我有一个WCF MSMQ服务(托管在Windows服务中)。我的方法上有TransactionScopeRequired属性。
我正在使用Nhibernate将我的数据保存到我的数据库中。我想确保在每次调用后关闭每个Nhibernate会话。
我在数据访问中使用了以下方法(使用城堡设施)
using(var session = sessionManager.OpenSession())
using(var transaction = session.BeginTransaction())
{
// do work
transaction.Commit()
}
但是当我的主要服务方法退出时,我收到一个错误,因为我已经处理了Nhibernate会话,我认为DTC需要这个来进行提交。
我的问题是:
关闭Nhibernate会话的最佳方法是什么 - 在DTC提交之后(即在退出我的服务方法之后?)。
谢谢。
答案 0 :(得分:3)
如果您将代码包装在以下
中using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress))
{
// code here
sc.Complete();
}
然后NHibernate不会在环境事务中登记,因此DTC不会依赖于数据库事务。
这是一种预感,因为您没有在问题中提供错误详情。
修改强>
当然,通过遵循此建议,您的数据库提交将不会在与出列操作相同的事务下执行,因此如果您的数据库出现故障,这可能会或可能不会导致出列事务将正在处理的消息回滚到队列,因此您可能会以这种方式丢弃邮件。您可以通过各种方式对此进行补偿,或者如果丢弃的消息的成本不高,您可以冒险。