Выполните следующий код сервера, а затем проверьте таблицу повышения и таблицу задач в базе данных. Связанные поля были обновлены правильно, что указывает на то, что транзакция была успешно зафиксирована.
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), полученные данные также являются обновленным значением. Похоже, что все очень хорошо.
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, а для управления сессией Nhibernate использую sessionFacotry.getCurrentSession.
Надеюсь, кто-то может помочь мне объяснить, как это работает.