2009-06-17 10 views
5

私は次のコードを持っています(議論のために簡略化されています)。私が理解できないのは、ロールバック後にsession.Transactionプロパティが別のトランザクションを返す理由です。ロールバック後のSession.Transactionの変化(NHibernate)

たとえば、最初のトランザクションへの参照を保存してそのトランザクションのプロパティをチェックしない限り、プロパティSession.Transaction.WasRolledBackはほとんど役に立ちません。

誰かがここでいくつかの洞察を提供できますか?

int transId = session.Transaction.GetHashCode(); 

using (var tx = session.BeginTransaction()) 
{ 
    Assert.AreEqual(transId, tx.GetHashCode()); 

    tx.Rollback(); 

    Assert.AreEqual(transId, tx.GetHashCode()); 
    Assert.AreEqual(transId, session.Transaction.GetHashCode()); // Fails 
} 

更新:

デビッドWalschots'答えは非常に有用かつ正確です。また、私はNhibernate Documentationで、次を発見した:

あなたがすぐ近くにすべきトランザクションをロールバックし、NHibernateの内部の状態が一貫していることを確認するために、現在のセッションを破棄した場合、「

答えて

6

のアクションでNHibernateのから。 (Kuaté、Harris、Bauer、King):

"トランザクションをコミットした後、NHibernateセッションはトランザクションを新しいトランザクションに置き換えます。これは、後で必要と思われる場合は、コミットしているトランザクションへの参照を保持する必要があることを意味します。これは、transaction.WasCommitedを呼び出す必要がある場合に必要です。 session.Transaction.WasCommittedは常にfalseを返します。

ほとんどの場合、Transaction.WasRolledBackプロパティにも同じことが適用されます。

関連する問題