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 :

Verrouiller une ligne dans une table avec sql server


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Par défaut Verrouiller une ligne dans une table avec sql server
    bonjour,
    je suis de faire une ptit application avec sql server,
    et je veux savoir, est ce qu'il y' a la possibilité de verrouiller seulement une ligne dans une table avec sql server,
    j'amurai savoir la syntaxe correspond.

    merci à tous

  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 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Les lignes sont verrouillées automatiquement par le serveur lors des lectures (verrous partagés) comme lors de écritures (verrous exclusif).
    Il n'y a donc rien à faire de particulier.... Un SGBDR n'est pas une tableur !

    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 averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Par défaut
    Merci pour votre réponse; mais je que lorsque un utilisateur entraine de modifier une ligne, aucun autre utilisateur peut consulter cette ligne.

    merci

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Que faites-vous alors dans le cas où un utilise ouvre une ligne en modification et s'arrête là. Disons qu'il part prendre un café et bloque alors la ligne pendant de très (trop) longue minute.

    Pire ! Il ouvre une ligne en modification et renverse ensuite de l'eau sur sa machine la mettant totalement et irrémédiablement hors service. Votre ligne restera alors bloquée.

    Bref, pour paraphraser sqlpro d'une manière un peu plus explicite, ce n'est pas une bonne manière de procéder.

    (Mais j'imagine que nous avons tous (moi en tout cas) eu ce genre d'idée à nos débuts)

  5. #5
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    benabdessamed,

    Je te proposerais utiliser les timestamps ou numéros des versions pour chaque ligne afin d'assurer le travail dans l'environnement concurrentielle sans avoir les verrouillages.

    I.e.
    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
    CREATE TABLE t1 (
      id int primary key,
      value nvarchar(50),
      version int
    )
    GO
    INSERT INTO t1 (1, 'Initial value', 1)
    GO
    -- Utilisateur 1 récupère l'info
    SELECT * FROM t1
    -- Utilisateur 2 récupère l'info
    SELECT * FROM t1
     
    -- Utilisateur 2 MAJ l'info
    UPDATE t1 SET value = 'New value 2', version = version + 1 WHERE id = 1 AND version = 1
    IF @@rowcount = 0
    -- @@rowcount = 1 => OK
     
    -- Utilisateur 1 MAJ l'info
    UPDATE t1 SET value = 'New value 1', version = version + 1 WHERE id = 1 AND version = 1
    IF @@rowcount = 0
    -- @@rowcount = 0 => erreur à traiter : cette ligne à été modifié par quelqu'un
    Certains ORM (object relation mapping) comme NHibernate supportent les versions ds objets (lignes des tables) automatiquement après en avoir défini dans un fichier du mapping.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Mais ceci alourdie et ne garantie pas la mise à jour....

    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/ * * * * *

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Par défaut
    auriez vous une autre solution.

  8. #8
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    Sans savoir la raison de nécessité de verrouillage je ne pense pas proposer la solution. Et en tous cas la solution doit être applicative.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Par défaut
    c'est pour travailler sous réseau.

  10. #10
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    Citation Envoyé par benabdessamed Voir le message
    c'est pour travailler sous réseau.
    Pour le travail dans l'environnement concurrentielle les verrouillages à long terme ne sont pas nécessaires et la bonne pratique est les éviter. Donc pour verrouiller une ligne, une raison fonctionnelle doit exister.

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Par défaut
    Qu'est ce que vous me conseillez ?

  12. #12
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    J'ai toujours utilisé les locks manuels avec un hint.

    Par exemple, lorsque mon utilisateur entre en "modification" sur la fiche d'un client, je veux que ce client ne puisse :
    - pas être modifié
    - pas être sélectionné
    (toute tentative allant dans l'un ou l'autre des des sens devra être mise en attente tant que mon utilisateur n'aura pas terminé la modification)

    Donc dans le code client :

    1/ Au chargement de la fiche client (en mode modification)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    begin transaction;
    select id, nom, age from client with rowlock holdlock;

    A partir de là, la ligne en question est lockée. Personne ne peut plus rien faire dessus, ni sélection, ni modification.

    2/ La mise à jour : à l'intérieur de la transaction
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update client set name = 'toto', age = '31' where id = 1;

    Ici, c'est toujours locké.

    3/ Libération du verrou lorsqu'on quitte la fiche du client :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    rollback;
    -- ou
    commit;

    Là, tout le monde peut de nouveau accéder à la ligne.

    Attention cependant : ce genre de verrous ralenti considérablement la base de données, et peut aboutir sur un dead lock !

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Par défaut
    bonjour,
    et maintenant, je veux savoir comment je peux savoir si une ligne est verrouillé ou non.

    merci.

Discussions similaires

  1. Récupérer une information d'une ligne dans une table
    Par Lebas dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/04/2013, 10h24
  2. Réponses: 6
    Dernier message: 17/09/2012, 09h00
  3. Colorer une ligne dans une image d'une interface
    Par yasmine2013 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 27/05/2012, 22h32
  4. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  5. Réponses: 3
    Dernier message: 29/01/2008, 12h08

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