Мне нужно увеличить число в столбце 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 [email protected]
INSERT INTO ORDERS VALUES (@NewOrderNumber, other order columns here)
COMMIT TRANSACTION
Моя проблема заключается в блокировке и проблемах concurrency и обеспечении уникального значения. Кажется, нам нужно заблокировать с помощью TABLOCKX
. Но это база данных большого объема, и я не могу просто заблокировать всю таблицу Orders
каждый раз, когда мне нужно сделать процесс SELECT MAX+1
и вставить новую запись заказа.
Но если я не заблокирую всю таблицу, то я не могу получить уникальное значение для этого клиента. Поскольку некоторые из наших заказов поступают поэтапно в партиях многопоточным процессом Windows, возможно, что 2 операции будут одновременно желать вставить новый заказ для одного и того же клиента.
Итак, какая методология блокировки или техника избегают взаимоблокировок и все же позволяют мне поддерживать уникальные порядковые номера PER клиента?