0

私が取り組んでいる MVC 3 プロジェクトは、現在のセッションの最後に行った挿入/更新呼び出しをコミット/ロールバックします。これは、複数の挿入を行っている現在を除いて、ほとんどの場合うまく機能します。

csv がサイトにアップロードされると、各レコードが解析されて DB に挿入されます。問題は、1 つのレコードの挿入に失敗した場合、以前のすべてのレコードがロールバックされ、その後のすべての試行がエラーで失敗することです。

    don't flush the Session after an exception occurs

セッションごとのリクエストを無効にするにはどうすればよいですか (または、何らかの方法でトランザクションを「再開」する必要がありますか)?

詳細を編集する

リクエストごとのセッションは、IHttpModule を実装するクラスで構成されます。このクラスは、HttpApplication コンテキストと UnitOfWork クラスを受け取ります。これは、コミットとロールバックが発生する場所です。

上記の UnitOfWork は、StructureMap を使用してリポジトリに挿入されます。

私が言ったように、この動作はサイトの残りの 99% で問題ありません。要求ごとのセッションのトランザクションを無視するには、この一括更新を取得する必要があります。または、新しいレコードごとにトランザクションを手動で再開する必要があります。方法がわかりません。

4

2 に答える 2

0

ISessionFlushModeデフォルト値のプロパティを持ちAuto

Auto ISession は、クエリが古い状態を返さないようにするために、クエリの実行前にフラッシュされることがあります。これがデフォルトのフラッシュ モードです。

Commit Transaction.Commit() が呼び出されると、ISession がフラッシュされます。

アプリケーションによって Flush() が明示的に呼び出されない限り、ISession は決してフラッシュされませんこのモードは、読み取り専用トランザクションでは非常に効率的です

Unspecified 未指定のフラッシュ モードの特別な値。

Always ISession はすべてのクエリの前にフラッシュされます。これはほとんどの場合不要で非効率的です。

値のISession's FlushModeプロパティを変更してみてください。Commit

于 2012-07-19T21:26:13.103 に答える
0

リクエストごとのセッションは、IHttpModule を実装するクラスで構成されます。

HttpModule で開始するリクエストごとのセッションは、NHibernate ではなく、ユーザーが行うものです。無効にする方法は、コードによって異なります。個人的には、UnitOfWork クラスで NHibernate を抽象化するのは好きではありません。これは、使用した抽象化が十分ではなく、ダーティ ハックがおそらく唯一の方法であることに気付いたからです。

あなたが実際にやりたいこと(そして推奨されていません)は次のとおりです。

foreach (var row in rows)
{
    using (var session = SessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
         var whatever = ...
         session.Save(whatever);
         tx.Commit();
    }
}
于 2012-07-25T09:14:36.580 に答える