2017-05-30 21 views
0

私は、次のコードを持っている:Commt()は、意志のNHibernateのロールバックの変更に失敗した場合Nhibernateは、コミットが失敗したときにトランザクションをロールバックしますか?

public void UpdateEntities() 
{ 
    Session.BeginTransaction(); 

    // add some entities there..... 

    Session.Transaction.Commit(); 
} 

を?

+1

上記のリンクを読んで、トランザクションを正しく廃棄していることを確認し、可能であれば "using"ステートメントを使用してください。 –

答えて

0

AdoTransactionref)から次のコードを見ると、コミットしようとしている間にNHがエラーにどのように反応するかがわかります。

if (session.FlushMode != FlushMode.Manual) 
{ 
    session.Flush(); 
} 

NotifyLocalSynchsBeforeTransactionCompletion(); 
session.BeforeTransactionCompletion(this); 

try 
{ 
    trans.Commit(); 
    log.Debug("DbTransaction Committed"); 

    committed = true; 
    AfterTransactionCompletion(true); 
    Dispose(); 
} 
catch (HibernateException e) 
{ 
    log.Error("Commit failed", e); 
    AfterTransactionCompletion(false); 
    commitFailed = true; 
    // Don't wrap HibernateExceptions 
    throw; 
} 
catch (Exception e) 
{ 
    log.Error("Commit failed", e); 
    AfterTransactionCompletion(false); 
    commitFailed = true; 
    throw new TransactionException("Commit failed with SQL exception", e); 
} 
finally 
{ 
    CloseIfRequired(); 
} 

トランザクションは明示的にロールバックされませんが、確かにコミットされません。したがって、あなたの質問に対する答えは「はい」と考えています。保留中のデータベースの変更はロールバックされます。

Flush()への呼び出しがtryにラップされていないことに注意するのは興味深いことです。したがって、ここでキャッチされた例外は、予期しない状態にあるSessionを残す可能性があることに留意する価値があります。したがって、例外処理に関するguidance

+0

私も参照してください。コミットが失敗した場合、catchブロックで手動でロールバックしようとすると問題が発生します。 CheckNotZombied()チェックで失敗します。 – Alexander

関連する問題