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 :

accès concurrents entre 2 services distincts sur une même table


Sujet :

Développement SQL Server

  1. #1
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut accès concurrents entre 2 services distincts sur une même table
    Bonjour,

    J'ai un petit souci d'accès concurrents avec 2 services windows utilisant la même table.
    Le but de ces services est de mettre à jour un montant (mais de 2 façons différentes). Dans le premier service, je procède de la façon suivante :

    SERVICE 1
    étape 0 :
    Begin Transaction

    étape 1 - récupération du dernier montant enregistré :
    SELECT TOP 1 Montant FROM maTable WITH (tablockx) WHERE ... ORDER ...
    cela me renvoie un chiffre que j'appelle Montant1

    étape 2 - calcul du nouveau montant
    Montant2 = Montant1 + x

    étape 3 - enregistrement du nouveau montant via une procédure stockée (c'est historique) :
    INSERT INTO [maTable] VALUES(Montant2)

    étape 4 - Commit Transaction


    SERVICE 2
    je procède de la même façon :

    étape 0 :
    Begin Transaction

    étape 1 - récupération du dernier montant enregistré :
    SELECT TOP 1 Montant FROM maTable WITH (tablockx) WHERE ... ORDER ...
    cela me renvoie un nombre que j'appelle Montant3

    étape 2 - calcul du nouveau montant
    Montant4 = Montant3 + y

    étape 3 - enregistrement du nouveau montant via un requête cette fois ci:
    INSERT INTO maTable VALUES(Montant4)

    étape 4 - Commit Transaction

    A priori, cela fonctionnait, sauf qu'hier, le 2 services se sont exécutés en même temps et que les accès concurrents, que je pensais gérés via le tablelockx, n'a pas fonctionné. Montant2 ET Montant4 ont été calculé à partir de la même valeur initialement récupérée dans ma table. Alors qu'avec une gestion correcte des accès concurrent, le service qui s'exécute en premier termine son exécution et l'insertion du nouveau montant dans la table avant que le second prenne la main et récupère le dernier montant enregistré (par le service 1) pour calculer, à son tour, le nouveau montant...

    Est-ce que à tout hasard, là, comme ça, y'a quelque chose qui vous saute aux yeux ? parce que n'étant pas expert en SQL Server, j'ai pensé, suite à mes diverses lectures, qu'un with tablelockx pouvait résoude mes problèmes... Mais je me suis manifestement gourré !

    Merci de votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Le select, même s'il est dans une transaction, génère un verrou partagé... laissant de ce fait l'accès en lecture à un autre select.

    Dans votre cas précis, il faut focer le verrouillage exclusif dès le select.

    Ceci ce fait via select ... with XLOCK

    Source

    Ce faisant, vous allez peut-être créer de la contention.... tout à un prix

  3. #3
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Le mieux à mon sens et comme le suggère Fadace est plutôt de mettre SET TRANSACTION ISOLATION LEVEL REPEATABLE READ.
    Cela permet de le spécifier une bonne fois pour toutes.
    D'autre part on peut le changer en cours de route, et si l'on spécifie un indicateur de table, il prend priorité sur le niveau d'isolation de transaction

    @++

  4. #4
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Je vais regarder tout cela... Merci de vos conseils !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/01/2013, 08h40
  2. [EJB3.1] Update concurrents sur une même table
    Par le2tbomi dans le forum Java EE
    Réponses: 4
    Dernier message: 29/10/2010, 12h07
  3. Accès multiple sur une même table
    Par ravaid dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/04/2008, 14h09
  4. Accès multiple sur une même table
    Par ravaid dans le forum Développement
    Réponses: 3
    Dernier message: 18/04/2008, 13h27
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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