首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回滚后的NHibernate 3会话状态()

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

Stack Overflow用户
提问于 2010-12-07 00:11:36
回答 1查看 5.2K关注 0票数 7

我有个问题。

代码语言:javascript
复制
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;
    }    
}

当我尝试在第一个using块中通过异常后的ID和tran.rollback()获取实体时,我得到了一个更新异常。因此,NHibernate尝试从第二个using块中的第一个using块更新实体。

为什么?我做了tran.Rollback()。我必须也做Session.Clear()吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-07 00:29:23

根据Hibernate的API,当Hibernate会话抛出异常时,您必须关闭该会话并创建一个新会话。此外,当您回滚Hibernate事务时,您不能稍后提交它或刷新会话-您必须在新会话中重新开始。

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4368421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档