回滚后的Session.Transaction更改(NHibernate)

时间:2009-06-17 14:54:28

标签: nhibernate transactions

我有以下代码(为了讨论而简化)。我不明白的是为什么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的内部状态是一致的。“

1 个答案:

答案 0 :(得分:7)

来自NHibernate in Action(Kuaté,Harris,Bauer,King):

  

提交事务后,NHibernate会话将替换它   新交易。这意味着你应该保留对它的引用   如果您认为以后需要它,那么您承诺的交易。   如果您需要调用transaction.WasCommited,这是必要的。   session.Transaction.WasCommitted总是返回false。

最有可能同样适用于Transaction.WasRolledBack属性。