プロジェクトで 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 メソッドのスコープ内で明示的にトランザクションを実行すれば、これを行うことができます。ポストフィルターとしては範囲外なのでできません。
この状況で他の人がどうするか見てみたい。