Reputation: 25975
I have the following code (simplified for the sake of discussion). What I don't understand is why the session.Transaction
property returns a different transaction after a rollback.
For instance, this means that the property Session.Transaction.WasRolledBack
is of little help unless I store a reference to the first transaction and check that transaction's property.
Can anybody provide some insight here?
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
}
Update:
David Walschots' answer is very helpful and precise. Also, I found the following in the Nhibernate Documentation:
If you rollback the transaction you should immediately close and discard the current session to ensure that NHibernate's internal state is consistent."
Upvotes: 6
Views: 3572
Reputation: 12640
From NHibernate in Action (Kuaté, Harris, Bauer, King):
After committing a transaction, the NHibernate session replaces it with a new transaction. This means you should keep a reference to the transaction you're committing if you think you'll need it afterward. This is necessary if you need to call transaction.WasCommited. session.Transaction.WasCommitted always returns false.
Most likely the same applies to the Transaction.WasRolledBack
property.
Upvotes: 7