1

プロジェクトで S#arp アーキテクチャを使用しています。これには、コントローラー メソッドの [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