Éviter les problèmes de concurrence avec MAX + 1 entier dans SQL Server 2008 ... créer sa propre valeur d'IDENTITÉ

J'ai besoin d'incrémenter un nombre entier dans un Serveur SQL server 2008 colonne.

Dirait que je doit utiliser un IDENTITY colonne, mais j'ai besoin d'incrémenter les compteurs séparés pour chacun de mes clients. Penser à un site de e-commerce où chaque client a son propre incrémentant le numéro de commande, en commençant par 1. Les valeurs doivent être uniques (par client).

Par exemple,

Customer1  (Order #s 1,2,3,4,5...)
Customer2  (Order #s 1,2,3,4,5...)

Essentiellement, j'ai besoin de faire manuellement le travail de SQL identity fonction puisque le nombre de clients est illimité et j'ai besoin de order # des compteurs pour chacun d'entre eux.

Je suis assez à l'aise:

BEGIN TRANSACTION
  SELECT @NewOrderNumber = MAX(OrderNumber)+1 From Orders where CustomerID=@ID
  INSERT INTO ORDERS VALUES (@NewOrderNumber, other order columns here)
COMMIT TRANSACTION

Mon problème est le verrouillage et la simultanéité de préoccupations et d'assurer une valeur unique. Il semble que nous avons besoin de le verrouiller avec TABLOCKX. Mais c'est un fort volume de la base de données et je ne peux pas juste de verrouillage de l'ensemble de la Orders de la table chaque fois que j'ai besoin de faire un SELECT MAX+1 processus et insérer un nouvel enregistrement de commande.

Mais, si je n'ai pas de verrouillage de l'ensemble de la table, alors je risque de ne pas obtenir une valeur unique pour le client. Parce que certains de nos l'entrée de la commande se fait après le fait dans des lots par un multi-fileté de processus de Windows, il est possible que 2 opérations sera à la fois vouloir insérer une nouvelle commande pour le même client.

Alors quelle méthodologie de verrouillage ou de la technique de éviter les blocages et encore permettez-moi de maintenir unique de l'incrémentation des numéros de commande PAR le client?

source d'informationauteur stackonfire