私は、次のコードを持っている:Commt()は、意志のNHibernateのロールバックの変更に失敗した場合Nhibernateは、コミットが失敗したときにトランザクションをロールバックしますか?
public void UpdateEntities()
{
Session.BeginTransaction();
// add some entities there.....
Session.Transaction.Commit();
}
を?
私は、次のコードを持っている:Commt()は、意志のNHibernateのロールバックの変更に失敗した場合Nhibernateは、コミットが失敗したときにトランザクションをロールバックしますか?
public void UpdateEntities()
{
Session.BeginTransaction();
// add some entities there.....
Session.Transaction.Commit();
}
を?
AdoTransaction
(ref)から次のコードを見ると、コミットしようとしている間に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。
私も参照してください。コミットが失敗した場合、catchブロックで手動でロールバックしようとすると問題が発生します。 CheckNotZombied()チェックで失敗します。 – Alexander
上記のリンクを読んで、トランザクションを正しく廃棄していることを確認し、可能であれば "using"ステートメントを使用してください。 –