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

MS SQL Server Discussion :

Verrouiller un enregistrement


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Verrouiller un enregistrement
    Bonjour,

    Mon problème et simple (et récurent) mais je ne parviens pas à le résoudre "simplement".

    Voila, j'ai un tableau (réalisé en Java-Web relié à une BDD SQl Server) représentant des demandes.
    Le fait de cliquer sur une ligne de ce tableau signifie "Je vais traiter la demande": Cela ouvre une fenêtre avec le détail de cette demande et l'utilsateur peut notifier "en cours" ou "clôturer" ainsi que l'action effectuée.
    Existe t'il un moyen (sans passer par une table dédiée) de:
    - L'utilisteur 1 clique sur la ligne => cela verrouille l'enregistrement en lecture/ecriture.
    - Pendant ce temps l'utilisateur 2 essaie également d'accéder aun même enregsitrement => Il se prend un message "enregistrement en cours de maj..."

    Comment réaliser cela simplement ??

    Merci!
    A+
    Pierre

  2. #2
    Membre éprouvé Avatar de cubitus91
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 726
    Points : 933
    Points
    933
    Le tag est bien utile, alors pensez y !

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par cubitus91
    J'ai lu ce tutoriel et connaissait les méthode de vérouillage.
    Mais concrètement ?
    La transaction ne peut être faite en une seule fois :
    L'utilisteur clique, je fait un select pour instancier mon objet et là quoi ?? Il existe une instruction LOCK ?
    Et cas échant un UNLOCK à la fermeture de fenêtre ?

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    La mauvaise méthode est de maintenir une transaction, la bonne est de gérer cela à la main dans une table de lock ou avec une colonne supplémentaire de ta table.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Avant tout merci pour votre réponse.
    OK je vais créer une table annexe qui va stocker l'id de l'enregistrement + l'id de la personne qui verrouille. Cela me permettra de mettre un message :
    Cet enregistrement est vérouillé par untel.

    Je vais de plus prévoir une proc stockée déclenchée la nuit qui tonque la table des vérrous.

    Pourriez-vous néanmois m'expliquer la méthode pour maintenir une transaction ?

    PS: Je trouve vachement décevant de SQL-Server qu'on ne peut pas le faire en natif.

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Citation Envoyé par Pierre59
    PS: Je trouve vachement décevant de SQL-Server qu'on ne peut pas le faire en natif.
    C'est une réaction assez courante. La mission du SGBD Client Serveur est de stocker et mettre à disposition des données en garantissant leur intégrité et leur cohérence. La logique de verrouillage au niveau du client ne les concerne pas.
    En réalité, les fonctionnalités que vous demandez existent bel et bien dans SQL Server. Il vous suffit de vous mettre en niveau d'isolation REPEATABLE READ et de créer une transaction explicite, que vous ne commiterez qu'après la fin de vos manipulations. Vous aurez des attentes sur des verrous chez les autres utilisateurs, et des timeouts, et non pas des messages clairs. Vous diminuerez très fortement la concurrence d'accès à vos données, et vous prendrez le risque qu'un utilisateur qui abandonne son ordinateur avec une fenêtre de votre programme ouverte, pour prendre des vacances de quinze jours, ne bloque tout le monde.

    Pour implémenter la solution manuellement :
    - créez une table qui contient l'identifiant de la table et de la ligne que vous voulez bloquer, ainsi que le login, le SPID, la date... tout ce dont vous avez besoin.
    - faites une procédure stockée standard de verrouillage et déverrouillage, une autre de vérification du verrou, qui retourne un message (en RAISERROR par exemple) clair lorsque la ligne est verrouillée.
    - Tournez régulièrement un job qui vérifie que le SPID est toujours actif, ou que le SPID est toujours sur le même login (pour traiter le cas de réattribution du SPID). S'il est inactif ou qu'un délai est dépassé, libérez le verrou.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

Discussions similaires

  1. Verrouiller un enregistrement
    Par REY10000 dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/03/2007, 01h35
  2. Verrouiller un enregistrement
    Par touhami dans le forum InterBase
    Réponses: 5
    Dernier message: 15/03/2006, 11h59
  3. Verrouiller un enregistrement
    Par PAUL87 dans le forum Access
    Réponses: 32
    Dernier message: 10/12/2005, 23h15
  4. Verrouiller un enregistrement lors d'un select
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 01/11/2005, 17h20
  5. verrouiller un enregistrement - VBA/Access
    Par sebouratif dans le forum Access
    Réponses: 2
    Dernier message: 07/10/2005, 13h03

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