首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nhibernate事务已成功提交,但查询的结果仍然是未修改的值。

Nhibernate事务已成功提交,但查询的结果仍然是未修改的值。
EN

Stack Overflow用户
提问于 2020-03-24 12:35:10
回答 1查看 125关注 0票数 0

执行以下服务器代码,然后检查数据库中的升级表和任务表。相关字段已正确更新,表明事务已成功提交。

代码语言:javascript
复制
using (ITransaction tx = session.BeginTransaction())
{
    try
    {
        Promotion p = session.Get<Promotion>(request.PromotionId);
        p.Status = PromotionStatus.Canceled;
        foreach (Task task in p.Tasks)
        {
            if (task.AnnounceStatus == TaskAnnounceStatus.New)
            {
                task.AnnounceStatus = TaskAnnounceStatus.PromotionCanceled;
                task.CancelTime = DateTime.Now;
                //session.Update(task);
            }
        }
        tx.Commit();
    }   
    catch
    {
        tx.Rollback();
        throw;
    }
}

然后执行以下查询(查询A),所获得的数据也是更新的值。看起来一切都很好。

代码语言:javascript
复制
tasks = session.Query<Task>().Where(p => p.AnnounceStatus == Model.TaskAnnounceStatus.New && p.ProcessStatus == Model.TaskProcessStatus.New).ToList();

但是,如果在提交事务之前使用以下代码对任务执行查询,则上述查询(查询A)的结果将得到旧的未修改的值。同时,您在数据库中看到的仍然是正确更新的值。

代码语言:javascript
复制
Task task = session.Get<Task>(taskId);

因此,我修改了第一段代码,并显式地调用了update方法(参见注释中的代码),这次一切都进行得很好。

我的猜测是,Nhibernate的缓存导致了上述问题。我使用syscache2来管理二级缓存,缓存被设置为ReadWrite,并使用sessionFacotry.getCurrentSession管理Nhibernate的会话。

希望有人能帮我解释一下这是怎么回事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-25 11:46:18

首先执行查询session.Get<Task>(taskId);。这将在第一级缓存中加载实体。

然后在您的事务中,您将Get Promotion实体。Task是它的IEnumerable属性。由于延迟加载,您的foreach循环使用ID taskID遍历Task实体-修改它-更新它-事务是成功的。由于所有这些都发生在事务中,所以session.Get<Task>(taskId);返回的初始实体不会被更新。它仍然保留着旧的价值观。

然后,您再次在事务外部session.Query<Task>()。这一次,NHibernate看到具有相同标识符的实体已经加载到会话缓存中(使用session.Get<Task>(taskId);查询),它不会再次加载该实体,它只是返回已经在会话缓存中的实体。当该实体保存旧值时,您会看到问题所在。

要确认这一点,请将所有这些查询放在事务块中并检查结果。

或者,正确地管理session的范围。

理解您的ISession是您的Unit Of Work;仔细检查它。

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

https://stackoverflow.com/questions/60831165

复制
相关文章

相似问题

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