NHibernate:同时选择最大值

NHibernate:同时选择最大值,nhibernate,transactions,Nhibernate,Transactions,假设我需要选择最大值作为订单号。因此,我将选择MAX(number),将number分配给order,并将更改保存到数据库。但是,我如何防止其他人弄乱数字?交易行吗?比如: ordersRepository.StartTransaction(); order.Number = ordersRepository.GetMaxNumber() + 1; ordersRepository.Commit(); 上面的代码是否会“锁定”更改,以便订单号只能由一个DB客户端读

假设我需要选择最大值作为订单号。因此,我将选择MAX(number),将number分配给order,并将更改保存到数据库。但是,我如何防止其他人弄乱数字?交易行吗?比如:

     ordersRepository.StartTransaction();
     order.Number = ordersRepository.GetMaxNumber() + 1;
     ordersRepository.Commit();

上面的代码是否会“锁定”更改,以便订单号只能由一个DB客户端读取/写入?假设事务是纯NHibernate事务,GetMaxNumber只从订单中选择MAX(Number)。

使用
ITransaction
IsolationLevel。Serializable
应该可以完成这项工作。不过,要小心表争用。如果你有高频率的更新,事情可能会大大放慢速度。使用
GetMaxNumber()
时,您可能需要分析数据库中的命中

我必须做一些类似的事情来生成用于高并发性使用的自定义ID。我的解决方案将ID生成移动到数据库中,并使用一个单独的
计数器
表来保存最大值

使用单独的
计数器
表有几个优点:

  • 它将删除
    订单
    表上的争用
  • 通常更快
  • 如果它足够小,可以将其固定到内存中
我还使用存储过程返回下一个可用ID:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
  UPDATE [COUNTER] SET Value = Value + 1 WHERE COUNTER_ID = @counterId
COMMIT TRAN

RETURN [NEW_VALUE]
希望有帮助