gpt4 book ai didi

rollback()后的NHibernate 3 session 状态

转载 作者:行者123 更新时间:2023-12-02 17:29:49 25 4
gpt4 key购买 nike

我有一个问题。

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 block 中的 tran.rollback() 后通过 ID 获取实体时,出现更新异常。因此,NHibernate 尝试从第一个 using block 更新第二个 using block 中的实体。

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

最佳答案

根据 Hibernate 的 API,当 Hibernate Session 抛出异常时,您必须关闭该 Session 并创建一个新的。另外,当您回滚 Hibernate 事务时,以后不得提交该事务或刷新 session - 您必须在新 session 中重新开始。

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

关于rollback()后的NHibernate 3 session 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4368421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com