我有个问题。
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()吗?
发布于 2010-12-07 00:29:23
根据Hibernate的API,当Hibernate会话抛出异常时,您必须关闭该会话并创建一个新会话。此外,当您回滚Hibernate事务时,您不能稍后提交它或刷新会话-您必须在新会话中重新开始。
特别是(这是一个实现细节,所以不要依赖它),在回滚之后,Hibernate会话仍然有自事务开始以来创建/修改的实体- Hibernate不会遍历您的实体并恢复您所做的所有更改。因此,如果您回滚事务,然后刷新会话,Hibernate将提交您认为已回滚的实体更改。如果您打算通过尝试破解此行为来玩火(例如通过清除会话),请小心。最好是重新开始一个新的会话。
https://stackoverflow.com/questions/4368421
复制相似问题