我有以下代码(为了讨论而简化)。我不明白的是为什么session.Transaction
属性在回滚后返回不同的事务。
例如,这意味着属性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
}
更新
David Walschots的回答非常有用且准确。另外,我在Nhibernate Documentation中找到了以下内容:如果你回滚事务,你应该立即关闭并放弃当前会话以确保NHibernate的内部状态是一致的。“
答案 0 :(得分:7)
来自NHibernate in Action(Kuaté,Harris,Bauer,King):
提交事务后,NHibernate会话将替换它 新交易。这意味着你应该保留对它的引用 如果您认为以后需要它,那么您承诺的交易。 如果您需要调用transaction.WasCommited,这是必要的。 session.Transaction.WasCommitted总是返回false。
最有可能同样适用于Transaction.WasRolledBack
属性。