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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...