【发布时间】:2016-09-05 14:26:13
【问题描述】:
我们有一个处理一些业务实体的 WCF Web 服务。 ORM 是休眠 4.0.4、.NET 4.0。 我们使用 IDispatchMessageInspector 在 AfterReceiveRequest 中打开一个会话和一个事务,上下文类是 wcf_operation:
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
if (!CurrentSessionContext.HasBind(this.factory))
{
this.log.Log.Debug("Creating NH Session");
var session = this.factory.OpenSession();
session.FlushMode = FlushMode.Never;
session.BeginTransaction();
CurrentSessionContext.Bind(session);
}
return null;
}
事务已提交,会话在 BeforeSendReply 中关闭。 只要一次只处理一个特定实体的调用,这就是有效的。
如果两个并发的 web 服务尝试更新同一个实体,我会得到一个休眠异常
NHibernate.HibernateException:非法尝试将集合与两个打开的会话关联
据我了解,两个更新在数据库级别发生冲突,我不明白 nhibernate 在这里遇到的问题。 根据我的理解,两个调用的两个会话应该是相互独立的;我在这里错过了什么吗?可能是配置?
如前所述,我看到了数据库存在的问题;尽管如此,我希望有一个例外声称有关并发更新的内容。 由于网络服务上的流量增加,我担心我的会话处理存在一般问题。
【问题讨论】:
-
你能告诉我们
BeforeSendReply方法吗?
标签: c# wcf nhibernate