我正在使用 NHibernate 与我的 C# .NET 项目中的数据库进行通信。与数据库通信时 - 我是否总是必须提交事务?这在读取时实际上做了什么?我发现自己在读取时偶尔会忘记提交,但一切似乎都工作正常。
using (var tx = Session.BeginTransaction())
{
var fromDb = Session.Get<User>(user.Id);
Assert.AreEqual(user.Id, fromDb.Id);
tx.Commit(); // <-- Necessary??
}
最佳答案
如果您只在事务期间进行读取,为什么还要启动该事务? 这是完全没有必要的。
尽管如此,如果您将连接 Release模式设置为“after_transaction”,则只有在事务提交或回滚后连接才会关闭。因此,在这些情况下,如果您想执行多个读取操作,确实可以方便地启动事务。
事实上,我主要做的是:
Person p = null;
using( ISession s = sf.OpenSession())
{
With.Transaction (s, () => p = s.Get (1));
}
例如。
其中“With.Transaction
”是一个实用方法,它启动事务、执行传递的委托(delegate)(操作),然后提交或回滚事务。
它看起来非常像这样:
public static class With
{
public static void Transaction( ISession s, Action proc )
{
using( ITransaction thx = s.BeginTransaction () )
{
try
{
proc();
thx.Commit();
}
catch
{
thx.Rollback();
throw;
}
}
}
}
但是,我的实现仍然略有不同,因为我不直接使用 NHibernate 的 ISession
。
相反,我在 ISession
周围创建了一个包装器,并且在该包装器中我还跟踪该 session 的当前事务(如果有)。
通过这样做,在 With.Transaction
方法中,我可以检查我的 session 是否已经有事件事务,然后,只有在没有事件事务的情况下才启动事务。
(With.Transaction
创意归功于 Ayende)。
关于c# - NHibernate:你总是需要提交吗?它在读取时实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145392/