[ MSSQL 2005] incrément d'un compteur unique
Hello,
Je suis en environnement ferme de serveur web avec 1 serveur SQL. J'ai développé un proc stoc qui permet de retourner un compteur unique. Le but étant que si deux serveurs web requêtent en même temps, qu'elle aient un compteur différent.
Ce compteur s'incrémente à chaque fois de 1. A savoir que ce compteur est préfixé d'un n° de module. Donc pour chaque module j'aurai un incrément différent.
Tout se passait bien depuis plusieurs mois lorsque j'ai découvert qu'à la même seconde (log faisant fois), deux serveurs web ont récupéré la même valeur de compteur pour un module donné!
Je ne comprends pas pkoi.
Est-ce que vous avez deux secondes pour regarder mon code ? :
PS : la proc stoc s'appuie sur une table qui contient un enregistrement par module. Deux : colornnes : un pour le compteur et un mpour le n° de module.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
-- =============================================
-- Description: Retourne un compteur unique
-- Exemple d'appel : execute sp_generateCompteur_test 40
CREATE PROCEDURE [dbo].[sp_generateCompteur_test]
@param_module tinyint, -- n° module
@param_out_libelle_erreur varchar(100) = '' OUTPUT -- libellé de l'erreur
AS
BEGIN
SET NOCOUNT ON;
DECLARE @compteurEnBase int -- valeur du compteur lu en base
SET @compteurEnBase = -1
-- Récupération du compteur et de la date actuelles
SELECT @compteurEnBase = tbl_compteur FROM TBL WHERE tbl_module = @param_module
IF (@@error <> 0)
BEGIN
SET @param_out_libelle_erreur = 'Impossible de récupérer le compteur en base'
RETURN 1
END
IF (@compteurEnBase = -1)
BEGIN
SET @param_out_libelle_erreur = 'enregistrement en base non présent'
RETURN 1
END
-- incrémentation du compteur
UPDATE TBL SET tbl_compteur = tbl_compteur + 1 WHERE tbl_module = @param_module AND tbl_compteur = @compteurEnBase
IF (@@error <> 0)
BEGIN
SET @param_out_libelle_erreur = 'Impossible de mettre à jour le compteur (test 3)'
RETURN 1
END
ELSE
BEGIN
-- renvoi du compteur
SELECT CAST(@param_module as varchar)+ right('00000'+cast((@compteurEnBase+1) as varchar),5)
END
END |
Merc d'avance de votre aide...