IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Probleme de concurrence


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut Probleme de concurrence
    Bonjour à tous, j'ai un petit soucis dans une procédure en gros je récupère un numéro et j'update une table avec ce numéro+1 mon souci et qu'il arrive que deux utilisateurs exécutent cette procédure de façon simultanée et je me retrouve avec deux fois le même numéro dans ma table updaté ce qui est très gênant, comment puis-je régler ce problème de concurrence ?? comment poser un verrou sur la procédure

    En attendant vos idées,
    merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Une procédure ne se verrouille pas et de toute façon se serait pire.

    Le seul moyen de faire cela est de construire une table de clef et faire une procédure transactionnée de prise de nouvelle clef.

    Inspirez vous de l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/clefs/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    Merci pour ta réponse mais en fait mon champ ne peux être considéré comme une clé, enfin je pense, c'est un champ de type alphanumérique les premiers caractères (alphabétique précise le lieu de la demande) et les nombres que je calcul viennent ensuite.


    En gros , je vais avoir FR1235 pour France demande 12835 le suivant va prendre FR12836 et de temps en temps ca foire je me retrouve avec deux référence identique.


    Désolé de ne pas avoir été suffisamment clair

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Dans ce cas créez votre table avec la liste des préfixes des pays.
    Référencez cette table dans votre table de clefs.
    Ajoutez à la table de clef une colonne une colonne calculée qui concatène le préfixe du pays avec le n° de la commande :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    CREATE TABLE pays
    (
    	ID_pays int IDENTITY NOT NULL CONSTRAINT PK_pays PRIMARY KEY,
    	nom_pays varchar(32) NOT NULL CONSTRAINT UQ_pays_nom_pays UNIQUE,
    	prefixe_pays varchar(3) NOT NULL CONSTRAINT UQ_pays_prefixe_pays UNIQUE
    )
    GO
     
    INSERT INTO dbo.pays (nom_pays, prefixe_pays) VALUES ('France', 'FR')
    GO
     
    CREATE FUNCTION fn_getPaysFromID (@_ID_pays int)
    	RETURNS varchar(3)
    	WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN
    	(
    		SELECT	prefixe_pays
    		FROM	dbo.pays
    		WHERE	ID_pays = @_ID_pays
    	)
    END
    GO
     
    -- SELECT dbo.fn_getPaysFromID(1)
     
    CREATE TABLE pays_commande_numero
    (
    	ID_pays_commande_numero int IDENTITY NOT NULL CONSTRAINT PK_pays_commande_numero PRIMARY KEY,
    	ID_pays int NOT NULL CONSTRAINT FK_pays_commande_numero__ID_pays FOREIGN KEY(ID_pays) REFERENCES dbo.pays (ID_pays),
    	CONSTRAINT UQ_pays_commande_numero__ID_pays UNIQUE (ID_pays),
    	numero_commande int NOT NULL,
    	pays_commande AS (dbo.fn_getPaysFromID(ID_pays) + CAST(numero_commande AS varchar(10)))
    )
    GO
     
    ALTER PROCEDURE ps_nouvelle_commande_ajouter
    	@_ID_pays int
    	, @_pays_commande varchar(13) OUTPUT
    AS
    BEGIN
    	SET NOCOUNT ON
    	SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
     
    	IF NOT EXISTS
    	(
    		SELECT	*
    		FROM	dbo.pays_commande_numero
    		WHERE	ID_pays = @_ID_pays
    	)
    	BEGIN
    		INSERT INTO dbo.pays_commande_numero (ID_pays, numero_commande)
    		VALUES (@_ID_pays, 0)
    	END
     
    	BEGIN TRANSACTION SET_KEY
     
    		UPDATE	dbo.pays_commande_numero
    		SET	numero_commande = numero_commande + 1
    		WHERE	ID_pays = @_ID_pays
     
    		SELECT	@_pays_commande = pays_commande
    		FROM	dbo.pays_commande_numero
    		WHERE	ID_pays = @_ID_pays
     
    	COMMIT TRANSACTION SET_KEY
    END
    GO
     
    -- Exemple d'utilisation
    DECLARE @new_pays_commande varchar(13)
    EXEC dbo.ps_nouvelle_commande_ajouter
    		@_ID_pays = 1
    		, @_pays_commande = @new_pays_commande OUTPUT
     
    SELECT @new_pays_commande
    Si vous préférez, vous pouvez faire cela avec une vue

    @++

Discussions similaires

  1. [Data] Probleme de concurrence
    Par sylvain75 dans le forum Spring
    Réponses: 0
    Dernier message: 05/04/2011, 17h38
  2. Probleme de concurrence
    Par Alec6 dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 22/10/2008, 15h37
  3. Probleme de concurrence avec les THREADS
    Par L4BiN dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 31/07/2006, 16h33
  4. Problème de concurrence
    Par soulhouf dans le forum Sécurité
    Réponses: 3
    Dernier message: 09/05/2006, 12h02
  5. Problème de concurrence d'accès sous Windows
    Par DJZiaK dans le forum SQLite
    Réponses: 6
    Dernier message: 10/05/2005, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo