7

NHibernate 3.0ではFlushMode.Auto、アンビエントトランザクションのみで実行されている場合(つまり、NHibernateトランザクションを開始しない場合)は機能しません。それが必要ですか?

using (TransactionScope scope = new TransactionScope()) 
{
    ISession session = sessionFactory.OpenSession();
    MappedEntity entity = new MappedEntity() { Name = "Entity", Value = 20 };
    session.Save(entity);

    entity.Value = 30;
    session.SaveOrUpdate(entity);

    // This returns one entity, when it should return none
    var list = session.
               CreateQuery("from MappedEntity where Value = 20").
               List<MappedEntity>();
}

(この関連する質問から恥知らずに盗まれた例)

NHibernateのソースでは、進行中のトランザクションがあるかどうかをチェックしていることがわかります(in SessionImpl.AutoFlushIfRequired)が、関連するメソッド( )はアンビエントトランザクションを考慮しませSessionImpl.TransactionInProgressん-いとこConnectionManager.IsInActiveTransactionはアンビエントトランザクションを考慮します。

4

4 に答える 4

6

朗報です。Jeff Sternal (問題を適切に特定した) のおかげで、私はhttps://nhibernate.jira.com/browse/NH-3583を更新しました。NH スタッフのおかげで、修正とプル リクエストがすでに存在するため、次のリリース 4.1. xx この問題は修正される予定です。

于 2015-03-04T08:33:36.137 に答える
3

常に明示的なNHibernateトランザクションを使用する必要があります。

using (TransactionScope scope = new TransactionScope()) 
using (ISession session = sessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    //Do work here
    transaction.Commit();
    scope.Complete();
}

NH開発者リストにも書いているようですが、これは将来変更される可能性がありますが、現在はそのように機能しています。

于 2011-03-05T23:24:20.653 に答える
2

オラクルデータベースを使用している場合、Diegoが提供する回答は機能しません。(関連する質問)。接続がすでにトランザクションの一部であるため、session.BeginTransactionは失敗します。

アプリケーション(WCF、NHibernate、Oracle)でこの問題を回避するコードを作成する必要があるように見えますが、NHibernateがすぐに提供できるもののように感じます。ですから、誰かが良い答えを持っているなら、それは本当にありがたいです。

于 2011-03-07T08:47:28.273 に答える
0

私にとっては、背後にある理由はわかりませんが、セッションが破棄される前にセッションフラッシュを強制することでうまくいったようです。例 using(session) { //自分の仕事をする

session.Flush(); }

これが分散トランザクションで機能することを確認しました。これを行わないと、TransactionScope が破棄されるときに常に「トランザクションが中止されました」と表示されるためです。

session.FlushMode を Commit に設定しても、うまくいきませんでした。

于 2014-02-26T12:15:07.803 に答える