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 :

Connaitre le nombre d'utilisateur sur une ligne


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2002
    Messages : 57
    Points : 37
    Points
    37
    Par défaut Connaitre le nombre d'utilisateur sur une ligne
    Bonjour,

    J'ai 2 tables sur un modèle maitre/détail et x utilisateurs peuvent ajouter des lignes au niveau détail en même temps.
    A la fin du traitement on doit "verrouiller" la ligne maitre (en passant un flag) pour qu'il n'y ai plus d'ajout possible au niveau détail.

    Comment puis-je savoir qu'il s'agit bien du dernier utilisateur qui demande me le "verrouillage" et qu'il n'y ai pas un autre utilisateur qui est en cours de traitement ?
    Je ne veux pas utiliser de compteur au niveau de la ligne maitre car s'il y a un plantage celui-ci ne sera pas à jour.
    Y at-il possibilité de jouer avec les triggers ou une autre astuce ?
    Wilfreed Legras

  2. #2
    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,

    Gérez la mise à jour de données dans une transaction en vérifiant que votre flag est faux.
    Laissez faire SQL Server pour la gestion des transactions, il s'en débrouillera bien mieux que vous

    @++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2002
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Bonjour Elsuket,

    Mon problème ne se situ pas vraiment lors du control de l'ajout de nouvelles lignes mais plus au niveau du traitement de "verrouillage".
    Exemple :
    Utilisateur 1 commence le traitement sur maitre 1
    Utilisateur 2 commence le traitement sur maitre 1
    Utilisateur 1 Arrete le traitement sur maitre 1 (pas de "verrouillage" car Utilisateur 2 est toujours en cours de traitement sur maitre 1)
    Utilisateur 2 arrete le traitement sur maitre 1 -> "verrouillage" car plus personne en cours de traitement sur sur maitre 1.
    Wilfreed Legras

  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 : 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
    Vous devez collecter les données qui permettent de procéder à la mise à jour avant la mise à jour.

    Votre transaction ressemble à ceci :

    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
    IF EXISTS
    (
    	SELECT *
    	FROM dbo.Maitre
    	WHERE IDMaitre = @IDMaitre
    	AND verouille = 0
    )
    BEGIN
    	BEGIN TRY
    		BEGIN TRANSACTION TR_AjouteDetail
     
    			INSERT INTO dbo.Details VALUES (@IDMaitre, ...)
     
    			UPDATE dbo.Maitre
    			SET verrouille = 1
    			WHERE IDMaitre = @IDMaitre
     
    		COMMIT TRANSACTION
    	END TRY
    	BEGIN CATCH
    		ROLLBACK TRANSACTION TR_AjouteDetail
    	END CATCH
    END
    Le ROLLBACK permet d'annuler la transaction si ce qui se trouve entre le BEGIN TRY et le END TRY provoque une erreur, donc la ligne d'IDMaitre = @IDMaitre aura la valeur verouille à 0

    @++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2002
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Mon problème n'est pas vraiment la transaction par elle même, mais de savoir à quel moment il faut "verouiller" la ligne maitre.
    Normalement je devrais gerer un compteur d'utilisateur sur la ligne maitre, comme l'exemple suivant :
    Utilisateur 1 commence avec Maitre 1 -> compteur utilisateur = 1
    Utilisateur 2 commence avec Maitre 1 -> compteur utilisateur + 1
    Utilisateur 1 termine avec Maitre 1 -> compteur utilisateur -1
    Utilisateur 2 termine avec Maitre 1 -> compteur utilisateur -1
    Compteur utilisateur = 0 -> "Verrouille"

    Le problème est que si je gère ce compteur via le code et qu'il y ai une coupure de courant par exemple, mon compteur utilisateur ne sera pas à jour.
    Wilfreed Legras

  6. #6
    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
    Le problème est que si je gère ce compteur via le code et qu'il y ai une coupure de courant par exemple, mon compteur utilisateur ne sera pas à jour
    C'est impossible de le prédire : SQL Server, avant d'exécuter une transaction, l'écrit dans le journal de transaction.
    Au redémarrage, il inspecte le journal de transactions pour savoir s'il existe des transaction à rejouer ou à défaire (parce qu'elles n'ont pas été appliquées aux données).
    Donc dans tous les cas la base de données reste dans un état cohérent.

    @++

Discussions similaires

  1. [XL-2000] Problème de détermination du nombre de valeurs sur une ligne
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/07/2014, 14h47
  2. Limiter le nombre d'utilisateurs sur une application
    Par SaladinDev dans le forum Général Java
    Réponses: 2
    Dernier message: 01/06/2011, 16h06
  3. connaitre le nombre d'utilisateur d'une bd access
    Par holdup37 dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/06/2007, 17h21
  4. Nombre maximun de caractère sur une ligne
    Par griese dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 12/03/2007, 12h29
  5. nombres d'images sur une lign automatique
    Par AnKhCHFR dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/03/2005, 11h52

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