У меня есть сценарий, с которым я обычно сталкиваюсь.Это просто сделать со стандартной транзакцией ADO, но не так много с NH (насколько я знаю).
У меня есть 2 таблицы для обновления.Первый содержит информацию о профиле (Profile), а другой (Work) содержит записи об изменениях, которые необходимо внести, и статус этих изменений.Для каждого обновления таблицы профиля будет обновляться статус в рабочей таблице.
- Если обновление таблицы профилей завершится неудачно, мне нужно обновить статус в рабочей таблице.
- Если обновление таблицы профиля прошло успешно, а обновление рабочей таблицы завершилось неудачно, мне нужно откатить транзакцию.
Проблема в том, что я не знаю,обновление таблицы профилей не удалось, пока я не совершу транзакцию.Я попытался выполнить очистку профиля, чтобы перехватить исключение, чтобы я мог записать состояние в рабочую таблицу, но затем произошел сбой моей фиксации с исключением, вызванным обновлением профиля.
Как я могу это обработать?В типичной транзакции ADO мой первый вызов сработает, но я могу перехватить и обновить все таблицы в транзакции.
Вот как выглядит мой код - довольно стандартный.Это не мой настоящий код, поэтому, пожалуйста, сосредоточьтесь на проблеме, а не на том, что я не удаляю транзакцию и не закрываю сеанс;):
try
{
ITransaction trans = _session.BeginTransaction();
var work = _repo.GetWork();
var profile = _repo.GetProfile(work.ProfileId);
try
{
profile.UpdateWithNewValues(work);
_session.SaveOrUpdate(profile);
_session.Flush();
work.Status = "Success";
}catch{
work.Status = "Failure";
}
_session.SaveOrUpdate(work);
trans.Commit();
}catch{
trans.Rollback();
}
Я понимаю, что Flush () не будет работать, но я не знаю, как еще это сделать.