Мне нужно увеличить целое число в столбце SQL Server 2008.
Звучит так, как будто я должен использовать столбец IDENTITY
, но мне нужно увеличить отдельные счетчики для каждого из моих клиентов. Подумайте о сайте электронной коммерции, где каждый клиент получает свой собственный увеличивающийся номер заказа, начиная с 1. Значения должны быть уникальными (для каждого клиента).
Например,
Customer1 (Order #s 1,2,3,4,5...)
Customer2 (Order #s 1,2,3,4,5...)
По сути, мне нужно будет вручную выполнить функцию SQL identity
, поскольку число клиентов не ограничено, и мне нужны счетчики order #
для каждого из них.
Мне вполне комфортно делать:
BEGIN TRANSACTION
SELECT @NewOrderNumber = MAX(OrderNumber)+1 From Orders where CustomerID=@ID
INSERT INTO ORDERS VALUES (@NewOrderNumber, other order columns here)
COMMIT TRANSACTION
Моя проблема заключается в блокировке и параллелизме и обеспечении уникального значения. Кажется, нам нужно заблокировать с помощью TABLOCKX
. Но это база данных большого объема, и я не могу просто блокировать всю таблицу Orders
каждый раз, когда мне нужно выполнить процесс SELECT MAX+1
и вставить новую запись заказа.
Но если я не заблокирую всю таблицу, я не смогу получить уникальное значение для этого клиента. Поскольку некоторые из наших заказов вводятся в пакетном режиме многопоточным процессом Windows, вполне возможно, что 2 операции одновременно захотят вставить новый заказ для одного и того же клиента.
Так какая методология или методика блокировки позволит избежать взаимных блокировок и все же позволяет мне поддерживать уникальные увеличивающиеся номера заказов на клиента?