NHibernate:同时选择最大值
假设我需要选择最大值作为订单号。因此,我将选择MAX(number),将number分配给order,并将更改保存到数据库。但是,我如何防止其他人弄乱数字?交易行吗?比如:NHibernate:同时选择最大值,nhibernate,transactions,Nhibernate,Transactions,假设我需要选择最大值作为订单号。因此,我将选择MAX(number),将number分配给order,并将更改保存到数据库。但是,我如何防止其他人弄乱数字?交易行吗?比如: ordersRepository.StartTransaction(); order.Number = ordersRepository.GetMaxNumber() + 1; ordersRepository.Commit(); 上面的代码是否会“锁定”更改,以便订单号只能由一个DB客户端读
ordersRepository.StartTransaction();
order.Number = ordersRepository.GetMaxNumber() + 1;
ordersRepository.Commit();
上面的代码是否会“锁定”更改,以便订单号只能由一个DB客户端读取/写入?假设事务是纯NHibernate事务,GetMaxNumber只从订单中选择MAX(Number)。使用
ITransaction
和IsolationLevel。Serializable
应该可以完成这项工作。不过,要小心表争用。如果你有高频率的更新,事情可能会大大放慢速度。使用GetMaxNumber()
时,您可能需要分析数据库中的命中
我必须做一些类似的事情来生成用于高并发性使用的自定义ID。我的解决方案将ID生成移动到数据库中,并使用一个单独的计数器
表来保存最大值
使用单独的计数器
表有几个优点:
- 它将删除
表上的争用订单
- 通常更快
- 如果它足够小,可以将其固定到内存中
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
UPDATE [COUNTER] SET Value = Value + 1 WHERE COUNTER_ID = @counterId
COMMIT TRAN
RETURN [NEW_VALUE]
希望有帮助