我需要在 SQL Server 2008 列中增加一个整数值。
听起来我应该使用 IDENTITY
列,但我需要为每个客户单独增加计数器。想象一下电子商务网站,每个客户都有自己的递增订单号,从1开始。这些值必须是唯一的(每个客户都唯一)。
例如:
Customer1 (Order #s 1,2,3,4,5...)
Customer2 (Order #s 1,2,3,4,5...)
基本上,由于客户数量是无限的,并且我需要为每个客户提供“订单号”计数器,所以我需要手动完成SQL的identity
函数的工作。
我相当熟练于进行以下操作:
BEGIN TRANSACTION
SELECT @NewOrderNumber = MAX(OrderNumber)+1 From Orders where CustomerID=@ID
INSERT INTO ORDERS VALUES (@NewOrderNumber, other order columns here)
COMMIT TRANSACTION
我的问题涉及锁定和并发问题以及确保唯一值。似乎我们需要使用TABLOCKX
进行锁定。但这是一个高流量的数据库,每次需要执行SELECT MAX+1
过程并插入新订单记录时,我不能仅锁定整个Orders
表。
但是,如果我不锁定整个表,那么可能无法为该客户获得唯一值。由于我们的部分订单录入是通过多线程Windows进程在事后批处理完成的,因此可能会有两个操作同时想要为同一客户插入新订单。
那么,哪种锁定方法或技术可以避免死锁,并仍然让我维护每个客户的唯一递增订单号?