我有一个我经常遇到的场景。使用标准 ADO 事务很简单,但使用 NH(据我所知)就不那么简单了。
我有 2 个表要更新。第一个包含配置文件信息(Profile),另一个(Work)包含需要进行的记录更改以及这些更改的状态。对于 Profile 表的每次更新,Work 表上的状态都会更新。
- 如果对 Profile 表的更新失败,我需要更新 Work 表的状态。
- 如果 Profile 表更新成功,Work 表更新失败,我需要回滚事务。
问题是,在我提交事务之前,我不知道对 Profile 表的更新是否失败。我试图在 Profile 上执行 Flush 以捕获异常,以便将状态写入 Work 表,但随后我的 Commit 因 Profile 更新导致的异常而失败。
我该如何处理?在典型的 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() 不起作用,但我不知道该怎么做。