【问题标题】:NHibernate atomic record updateNHibernate 原子记录更新
【发布时间】:2011-12-04 20:57:03
【问题描述】:

在不打开事务的情况下从表中原子更新记录的最佳方式(如果有的话)是什么?我的意思是像

 UPDATE Table_1 SET Value=Value+@Increment WHERE Id=@Id

也许可以通过 HQL 或 NHibernate 的平面 SQL...

上一个 NHibernate 版本是否支持通过 HQL 更新?! 这个说法呢?

  UPDATE Table_1 SET Value=Value+@Increment, @Result=1
        WHERE Id=@Id AND Value+@Increment<=@MaxLimit;SELECT @Result

【问题讨论】:

  • 您为什么关心交易?如果你没有明确指定一个事务,一个事务将由数据库本身隐式创建。(例如 Sql Server)
  • 是的,但是如果我已经在 NHibernate 中打开了一个事务,并且这个更新我想继续使用更严格的隔离级别,会发生什么?到目前为止,NHibernate 还没有嵌套事务 :(

标签: .net nhibernate transactions


【解决方案1】:

HQL:

session.CreateQuery("UPDATE Entity1 SET Value=Value + :Increment WHERE Id=:Id")
    .SetParameter("Increment", 10)
    .SetParameter("Id", 5)
    .ExecuteUpdate()

SQL:

session.CreateSqlQuery("UPDATE Table_1 SET Value=Value + :Increment WHERE Id=:Id")
    .SetParameter("Increment", 10)
    .SetParameter("Id", 5)
    .ExecuteUpdate()

【讨论】:

  • 这些语句是否实现了原子更新?我应该将它们包装在具有适当隔离级别的事务中吗?
  • 您应该将它们包装在事务中以使其清楚,但是当您不使用 NHibernate 和/或数据库将隐式执行时
  • 如果我已经在 NHibernate 中打开了一个事务,并且这次更新我想继续使用更严格的隔离级别会怎样?到目前为止,NHibernate 还没有嵌套事务 :(
  • 那么您必须在 NH 中打开另一个会话或实现嵌套事务(我使用自定义 transactionfactory,但它有点工作)
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多