c# - NHibernate:你总是需要提交吗?它在读取时实际上做了什么?

标签 c# .net nhibernate

我正在使用 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/

相关文章:

c# - 使用 Shell 命令在 .net 4.0 中解压缩没有外部包?

c# - WCF 查询拦截器 : Is this MSDN sample a security risk?

c# - 空字符串 ""何时是有效的日期时间字符串格式?

c# - 如何从 TDOA 查找源的位置

c# - 如何从 SQL Azure 应用服务 Web 应用写入日志文件?

c# - 当内部调用不是自然异步时,如何创建自然异步方法?

.net - C#/VB .Net 中的代码生成实用程序

asp.net - 二级缓存关闭,锁定时缓存项仍过期?

c# - 聚合根中的 NHibernate 和拦截器

entity-framework - ORM 懒加载有什么好处?