【问题标题】:NHibernate - Only select, should I commit or rollback?NHibernate - 只选择,我应该提交还是回滚?
【发布时间】:2015-03-12 18:14:21
【问题描述】:

在 nhibernate 中执行 Select 时,我认为 Rollback 比 Commit 更快,因为 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();

?

【问题讨论】:

  • 如果只执行一次选择,为什么还需要使用事务?
  • 比我知识渊博得多的人suggests它。抵抗是徒劳的 - 会有交易。

标签: c# oracle nhibernate transactions


【解决方案1】:

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

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

  1. 您的代码清楚地表明,在只读事务中完成的工作不会将任何内容写入数据库,并且
  2. 您可以保护自己免受由不良 NHibernate 映射引起的ghost updates

从直觉上讲,回滚事务会更快一些,但我找不到任何 (NHibernate) 文档来支持它。

【讨论】:

    【解决方案2】:

    继续提交事务,因为您启动了它并且没有错误。即使您将其用于选择。

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

    【讨论】:

    • 帖子回答主要导致“如果您没有更改任何内容,那么您可以使用 COMMIT 或 ROLLBACK。任何一个都将释放您获得的任何读锁,因为您没有” t 进行任何其他更改,它们将是等效的。”。是的,它们是从客户的功能角度来看的。但在性能方面他们可能不会。
    • 是的...但实际上,如果其他开发人员更改代码并在 select 语句中间添加更新操作,则如果有人选择使用回滚,则更新可能无法正常工作。我相信在某些地方使用提交操作并在其他地方使用回滚会导致软件的一致性问题。
    • 另一方面,如果后来的开发人员在设计为 Select 的东西中添加了更新,那么让此更新不起作用可能是一个不错的选择。开发人员很有可能发现他/她的代码不起作用。在捕获其他代码时,依靠此选择,由于新添加的更新而失败可能会更难。真正的意见/设计问题,决定谁拥有错误和责任。
    【解决方案3】:

    我对 DB 东西的来龙去脉的了解需要工作,但我认为交易发生的方式更像是一种方式而不是两种方式。

    意思是更新、插入、删除我正在“设置”数据,这是一个可能需要回滚等的事务。

    在“获取”现有数据时选择数据,而不是更改数据或影响其值,因为不需要发生事务。

    据我所知,当您提到“提交”时,我看不到在选择时发生了这种情况,正如我所说,似乎没有发生事务,因为我只是获取数据,而不是更改其值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2012-09-27
      相关资源
      最近更新 更多