1

全て、

これは、n-hibernateセッションを使用してデータを読み書きするために使用されるパターンです。

using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
    // all the code that uses the session goes here
    // use session to load and/or save entity
}

私の質問は:

トランザクションを開始すると、接続でデータベーストランザクションが開始されますが、対応するcommitステートメントが表示されません。むしろ、txのusingステートメントがtx.Dispose()を呼び出します。(SqlTransactionオブジェクトを使用するAdoTransactionクラスからの)n-hibernateソースを見ると、基になるトランザクションオブジェクトはコミットされることはなく、以下に示すように破棄されます。それで、SqlTransactionプロバイダーが破棄する前にcommitを呼び出すと想定しますか?それはado.netのSqlClientプロバイダーのどこかのドキュメントですか?

if (isDisposing)
{
    if (trans != null)
    {
        trans.Dispose();
        trans = null;
        log.Debug("IDbTransaction disposed.");
    }

    if (IsActive && session != null)
    {
        // Assume we are rolled back
        AfterTransactionCompletion(false);
    }
}

明らかに、tx.Dispose()が呼び出されたときにセッションをフラッシュするコードを見つけることができなかったため、何かが欠けています。

4

1 に答える 1

2

ガベージコレクターがオブジェクトに到達すると、トランザクション自体がエラーをスローした場合があるためCommitTransaction、ブロックの一部として自分自身を呼び出すことになっているという考えがあります。その場合、それをコミットするには、あなたはそれを処分したいだけです。usingDisposeDispose

于 2013-03-14T17:46:15.800 に答える