NHibernate - 只有选择,我应该提交还是回滚?

时间:2015-01-14 14:15:44

标签: c# oracle nhibernate transactions

当选择nhibernate时,我认为回滚比提交更快,因为NHibernate和Oracle都不需要检查是否有任何更新。

但是我发现的所有例子都在选择后做了提交 如果我使用隐式事务,框架会执行回滚。

我的问题是关于速度和资源使用,而不是关于架构或编码麦克风。

(现在编写nhibernate的人比我更了解nhibernate的内部信息,并且他们选择在只有Select的隐式事务上进行回滚。这可能与我完全不同的原因(不提交)必须导致回滚是一个可能的原因)。)

(还有一个关于在未来可能的编辑中会发生什么应该发生的建筑/心理论点,其中有人决定在同一代码中调用更新。如果开发人员对回滚感到惊讶,或者错误的更新应该让用户感到惊讶提交?这个讨论不是主要问题的一部分。)

using (var session = Helper.SessionFactory.OpenSession())
{
    using (var tran = session.BeginTransaction())
    {
        var ret = session.Query<Person>().Where(x => x.Id == id).Single();
        tran.Rollback();  // <----- or commit?
        return ret;
    }
}

或者我应该打电话

tran.Commit();

3 个答案:

答案 0 :(得分:2)

首先,正如您在评论中所述,您应该始终使用NHibernate在事务中包装代码。

我不确定回滚与提交的性能影响,但我发现了只读事务的想法(即在使用结束时总是回滚的事务)有用有两个主要原因:

  1. 您的代码清楚地表明在只读事务中完成的工作不会向数据库写入任何内容,并且
  2. 您可以保护自己免受因NHibernate映射错误导致的ghost updates
  3. 直观地说,回滚一个事务会有点快,但我找不到任何(NHibernate)文档来支持它。

答案 1 :(得分:1)

继续提交事务,因为你启动它并且没有错误。即使你用它来选择。

也看看这个:Should I commit or rollback a read transaction?

答案 2 :(得分:0)

我对DB内容的来龙去脉的知识需要工作,但我认为交易发生的方式更像是1路而不是2路。

含义更新,插入,删除我是&#34;设置&#34;数据,这是一个可能需要回滚等的事务。

选择数据im&#34;获取&#34;现有数据,我不会改变数据或影响其价值,因为不需要进行交易。

据我所知,当你提到&#34;提交&#34;时,我无法看到选择中出现的情况,正如我所说,似乎没有交易发生,因为我只是简单地获取数据,而不是改变它的价值观。

也许某些具有某些具体事实的人可以提出更好的建议。