J'ai une application qui utilise des numéros d'incidents (parmi d'autres types de numéros). Ces numéros sont stockés dans une table appelée "Number_Setup", qui contient la valeur actuelle du compteur. Lorsque l'application génère un nouvel incident, la table number_setup reçoit la ligne de compteur de nombre requise (les compteurs peuvent être réinitialisés quotidiennement, hebdomadairement, etc. et sont stockés comme des int). Il incrémente ensuite le compteur et met à jour la ligne avec la nouvelle valeur.Assurer des numéros uniques à partir d'une base de données de serveur SQL
L'application est multi-utilisateur (environ 100 utilisateurs à la fois, ainsi que des jobs SQL qui exécutent et capturent 100 enregistrements d'incidents et demandent des numéros d'incidents pour chacun). La table des incidents comporte des numéros d'incident en double où ils ne doivent pas être dupliqués.
Un proc stocké est utilisé pour récupérer le compteur suivant.
SELECT @Counter = counter, @ShareId=share_id, @Id=id FROM Number_Setup WHERE [email protected] AND Counter_Type='I' IF isnull(@ShareId,0) > 0 BEGIN -- use parent counter SELECT @Counter = counter, @ID=id FROM Number_Setup WHERE [email protected] END SELECT @NewCounter = @Counter + 1 UPDATE Number_Setup SET Counter = @NewCounter WHERE [email protected]
Je suis maintenant entouré ce bloc avec une transaction, mais je ne suis pas tout à fait sûr que ce sera 100% de résoudre le problème, car je pense qu'il ya des verrous encore partagés, de sorte que le compteur peut être lu de toute façon.
Peut-être que je peux vérifier que le compteur n'a pas été mis à jour, dans la déclaration de mise à jour
UPDATE Number_Setup SET Counter = @NewCounter WHERE Counter = @Counter IF @@ERROR = 0 AND @@ROWCOUNT > 0 COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION
Je suis sûr que cela est un problème commun avec les numéros de facture dans les applications financières, etc.
Je ne peux pas mettre la logique dans le code soit et utilisez le verrouillage à ce niveau. J'ai également verrouillé à HOLDLOCK mais je ne suis pas sûr de son application. Devrait-il être mis sur les deux instructions SELECT?
Comment puis-je m'assurer qu'aucun doublon n'est créé?
quelle version de Sql Server? – RBarryYoung
en ce moment, 2000. –