我在一个项目中使用 S#arp Architecture,它带有 Controller 方法的 [Transaction] 属性。这样,Transaction Commit 被称为 OnActionExecuted 过滤器,这意味着它在退出 Controller 方法范围后发生。我的问题是在提交期间发生异常时会发生什么?
从S#arp源码中可以看到TransactionAttribute.cs中的如下代码
public override void OnActionExecuted(ActionExecutedContext filterContext) {
string effectiveFactoryKey = GetEffectiveFactoryKey();
ITransaction currentTransaction =
NHibernateSession.CurrentFor(effectiveFactoryKey).Transaction;
if (currentTransaction.IsActive) {
if (filterContext.Exception == null) {
currentTransaction.Commit();
}
else {
currentTransaction.Rollback();
}
}
}
例如,如果用户尝试在存在外键约束(并且数据错误)的情况下提交保存,则提交将产生未处理的数据库异常。与其将用户转储到通用错误页面(类似于 [HandleError] 构造),我更愿意将它们直接返回到它们所在的位置,以便他们可以纠正问题。如果我在 Controller 方法的范围内显式地执行事务,我可以这样做。我不能,因为作为后过滤器,它超出了范围。
我想看看其他人在这种情况下会怎么做。