回滚后的NHibernate 3会话状态()

回滚后的NHibernate 3会话状态(),nhibernate,session,transactions,rollback,Nhibernate,Session,Transactions,Rollback,我有个问题 using (var tran = repository.Session.BeginTransaction()) { try { repository.Save(entity); tran.Comit(); } catch(Exception) { tran.Rollback(); throw; } } using (var tran = repository.S

我有个问题

using (var tran = repository.Session.BeginTransaction())
{
    try
    {
        repository.Save(entity);
        tran.Comit();
    }
    catch(Exception)
    {
        tran.Rollback();
        throw;
    }    
}

using (var tran = repository.Session.BeginTransaction())
{
    try
    {
        repository.GetById(id);
        tran.Comit();
    }
    catch(Exception)
    {
        tran.Rollback();
        throw;
    }    
}
当我尝试在异常后按ID获取实体,并在第一个
块中使用
执行
tran.rollback()
时,我得到一个更新异常。因此,NHibernate试图在第二个
using
块中使用
从第一个
块更新实体


为什么??我执行了
tran.Rollback()
。我也必须执行会话.Clear()

根据Hibernate的API,当Hibernate会话引发异常时,必须关闭会话并创建一个新会话。另外,当回滚Hibernate事务时,以后不得提交它或刷新会话-必须在新会话中重新启动


特别是(这是一个实现细节,所以不要依赖它),回滚后,Hibernate会话仍然有自事务开始以来创建/修改的实体-Hibernate不会遍历您的实体并还原您所做的所有更改。因此,如果回滚事务,然后刷新会话,Hibernate将提交您认为回滚的实体更改。如果您打算通过尝试绕过此行为(例如清除会话)玩火,请小心。最好从一个新会话开始。

好的,但我的会话由structuremap ioc进行上下文管理,并且是每个wcf调用。如果我处理了会话,那么我将在其他地方出现错误。您会遇到哪些异常?你能阻止他们吗?你能在这里发布它们吗?我得到了GenericAdoException,因为我试图插入一个重复的值,该值必须是唯一的。但这不是重点。我需要知道什么是最佳实践。到目前为止,我有类似于上面的异常处理。但现在,我发现这还不够。我无法预测可能发生的每一个异常,我需要进行异常处理,我需要知道我必须做些什么,这样我才不会在db中获取无效数据。@Luka因为您每次调用都使用一个会话,所以每次调用都有一个事务(每个会话的事务)是有意义的。这将为上下文工作单元提供服务,其中每个调用都没有潜在的副作用:如果一个查询在调用中失败,那么调用中完成的所有db操作都将回滚。