1

我在一个项目中使用 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 方法的范围内显式地执行事务,我可以这样做。我不能,因为作为后过滤器,它超出了范围。

我想看看其他人在这种情况下会怎么做。

4

0 回答 0