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

  1. #21
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    bonjour StringBuilder,

    lorsque j'utilse "begin transaction" toutes les lignes de la table devient non modifiable.

  2. #22
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    Bien sur que non.
    On ne jouit bien que de ce qu’on partage.

  3. #23
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    Et il y a une différence entre :
    - Je lock les lignes que j'ai modifié jusqu'à ce que je valide/invalide la transaction
    - Je lock les lignes que je lis, jusqu'à ce que je valide/invalide la transaction

    Le premier cas est implicite avec les transactions.

    Le second cas n'est pris en charge que par hint : il faut indiquer au SGBD qu'on lock ou non la table/page/ligne qu'on lit.
    On ne jouit bien que de ce qu’on partage.

  4. #24
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    ...
    Le second cas n'est pris en charge que par hint : il faut indiquer au SGBD qu'on lock ou non la table/page/ligne qu'on lit.
    Pas tout à fait... En niveau d'isolation READ COMMITTED ou SERIALIZABLE les lignes lues sont verrouillées jusqu'à la fin de la transaction.

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

  5. #25
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    mon problème est que lorsque j'utilise "begin transaction" et que j'ai deux utilisateurs qui ont l'accès en exclusivité à deux lignes différentes d'une même table, l'un après l'autre. par conséquence le deuxième ne peut modifier la ligne dont il a l'accée. .

    merci.

  6. #26
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    Poste ton code, qu'on sache au moins comment tu verrouilles tes lignes.

    En tout cas "begin transaction", sans instruction derrière, ne provoque absolument aucun verrou.
    On ne jouit bien que de ce qu’on partage.

  7. #27
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    bonjour,
    mon code est :
    BEGIN TRAN

    SELECT * FROM PCC_COM WITH (HOLDLOCK, ROWLOCK) WHERE CODE = '10'

    COMMIT TRAN

    durant exécution de "select" et avant "COMMIT TRAN" la table est verrouillé.

    merci pour votre aide

  8. #28
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    Le responsable, c'est ton "with".

    Il provoque un verrou exclusif sur la ligne lue.

    Plus exactement, sur la page lue, car par défaut, SQL Server ne fait pas des verrous à la ligne, mais à la page.

    Cf. blog de SQLPro pour plus d'informations sur le sujet.
    On ne jouit bien que de ce qu’on partage.

  9. #29
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    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 !
    Ce que tu fais est une véritable horreur !!!
    En effet un simple SELECT * sur la table devient impossible !

    J'ose espérer qu'en tant que chef de projet tu n'a pas implémenté cela en production ?


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

  10. #30
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    bonjour;
    j'ai trouver la solution; il faut que la table a une clé.

  11. #31
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 16
    Points : 4
    Points
    4
    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