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...
Partager