【问题标题】:Using nHibernate, how can I read uncommited?使用 nHibernate,我如何读取未提交的内容?
【发布时间】:2018-03-24 04:08:29
【问题描述】:

使用 nhibernate,如何将事务级别设置为读取未提交?

使用 SQL,我通常在存储过程的开头设置事务级别或使用内联 (NOLOCK)。

【问题讨论】:

  • 无论你在做什么,read uncommitted 真的是在自找麻烦。我从未见过使用它的真正理由。实际禁用事务隔离的应用程序没有正确使用事务。
  • 这有点像 dba 神话。这是设计选择,就像所有设计选择都应该基于您所在的领域。对于基本的中小型 Web 项目和客户端应用程序(我猜这是绝大多数人工作的地方),那么这可能是正确的做法。决定是成本与风险,在实时环境中运行无事务和脏读几乎是常态。大型电子商务网站(如 ebay)也将与 RT 应用程序共享许多设计决策,交易级别如此之高,使用它们的风险太大。回滚的成本会削弱你。
  • Martin Fowler 在这里发表了评论:martinfowler.com/bliki/Transactionless.html
  • 这是我使用 SQL 拦截器的解决方案。 stackoverflow.com/questions/1302746/…

标签: nhibernate


【解决方案1】:

您可以通过以下步骤将nolock 内联 SQL 与 nhibernate 一起使用:

  1. 使用以下方法创建 HBM 文件

    <sql-query name="PersonList">
    return alias="person"  class="Person">
    SELECT * FROM Person WITH(nolock) 
    <sql-query>
    
  2. 在创建休眠会话时使用AddXmlFile(hbm file path)

  3. 使用DBSession.GetNamedQuery("PersonList")获取人员列表。

【讨论】:

    【解决方案2】:

    According to the documentation, 可以通过hibernate.connection.isolation 设置。如果您需要更精确的控制,请查看 NHibernate 的 pessimistic locking 机制。

    【讨论】:

      【解决方案3】:

      这对我有用(特定于 SQL 服务器)

        IDbCommand NHCommand;
      
        NHCommand= NHSession.Connection.CreateCommand();
      
        NHCommand.CommandText= "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED";
      
        NHCommand.ExecuteNonQuery();
      

      类似于与 RDBMS 直接对话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 2019-07-21
        • 1970-01-01
        • 2020-05-01
        • 2012-07-25
        • 1970-01-01
        相关资源
        最近更新 更多