【发布时间】:2020-07-04 22:55:49
【问题描述】:
执行以下服务器代码,然后检查数据库中的促销表和任务表。相关字段已正确更新,说明事务已成功提交。
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;
}
}
然后执行下面的查询(Query A),得到的数据也是更新后的值。看起来一切都很好。
tasks = session.Query<Task>().Where(p => p.AnnounceStatus == Model.TaskAnnounceStatus.New && p.ProcessStatus == Model.TaskProcessStatus.New).ToList();
但是,如果我在提交事务之前使用以下代码对任务执行查询,则上述查询的结果(查询 A)将获得旧的未修改值。同时,您在数据库中看到的仍然是正确更新的值。
Task task = session.Get<Task>(taskId);
所以我修改了第一段代码,并显式调用了更新方法(见注释处的代码),这次一切正常。
我的猜测是 Nhibernate 的缓存导致了上述问题。我使用syscache2管理二级缓存,缓存设置为ReadWrite,使用sessionFacotry.getCurrentSession管理Nhibernate的会话。
希望有人能帮我解释一下这是如何工作的。
【问题讨论】:
-
以上三段代码位于session的独立作用域,每次都通过NHibernateHelper.GetCurrentSession()获取session。所以我认为问题出在二级缓存上。如果没有显式调用update方法,我认为nhibernate不会在事务提交的时候同步更新二级缓存。
标签: nhibernate transactions second-level-cache