当选择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();
答案 0 :(得分:2)
首先,正如您在评论中所述,您应该始终使用NHibernate在事务中包装代码。
我不确定回滚与提交的性能影响,但我发现了只读事务的想法(即在使用结束时总是回滚的事务)有用有两个主要原因:
直观地说,回滚一个事务会有点快,但我找不到任何(NHibernate)文档来支持它。
答案 1 :(得分:1)
继续提交事务,因为你启动它并且没有错误。即使你用它来选择。
答案 2 :(得分:0)
我对DB内容的来龙去脉的知识需要工作,但我认为交易发生的方式更像是1路而不是2路。
含义更新,插入,删除我是&#34;设置&#34;数据,这是一个可能需要回滚等的事务。
选择数据im&#34;获取&#34;现有数据,我不会改变数据或影响其价值,因为不需要进行交易。
据我所知,当你提到&#34;提交&#34;时,我无法看到选择中出现的情况,正如我所说,似乎没有交易发生,因为我只是简单地获取数据,而不是改变它的价值观。
也许某些具有某些具体事实的人可以提出更好的建议。