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 :

transactions et verrous : qqchose d'étonnant


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Par défaut transactions et verrous : qqchose d'étonnant
    Bonjour,


    Avec les collègues nous avons constaté quelque chose d'étonnant.

    Dans une transaction en mode Read Commited (par défaut sous SQL Server), nous avons fait ce test :

    Dans un processus (une "nouvelle requête") sous Sql Server Management, nous avons mis un verrou sur une ligne comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET TRANSACTION ISOLATION LEVEL READ COMMITED
    BEGIN TRANSACTION
    update t_exemple where id=1234;
    WAITFOR DELAY '00:00:20'
    COMMIT TRANSACTION
    La ligne de t_exemple dont l'id est 1234 est verrouillé pendant 20 secondes.

    Dans ce laps de temps, nous avons verifié que la ligne était bien verrouillé, avec une nouvelle requête dans Sql Server Management (2eme processus sur Sql Server) avec cette procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t_exemple where id=1234;
    Effectivement, la ligne était bien verrouillé car elle ne nous a été rendu qu'après la fin de la première requête.

    Ensuite on a fait la même chose mais nous avons remplacé la deuxième requête par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t_exemple
    Sans préciser que nous voulions l'id 1234.

    Eh bien, le résultat comprenant l'id 1234 nous a été retourné avant la fin de la première requête.. Il semble donc qu'il n'y avait pas de verrou sur la ligne dont l'id est 1234.

    Auriez vous une explication à cela ?


    D'avance merci beaucoup

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 16
    Par défaut
    Est que vous avez repeté plusieurs fois l'expérience ?

  3. #3
    Membre actif
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Par défaut
    bonjour,

    oui bien sur. Je vous invite à faire la même expérience vous même pour le vérifier (ou non) ..

  4. #4
    Membre actif
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Par défaut
    rebonjour,

    Je n'ai toujours pas résolu ce problème..

    Je suis à l'affut de toutes explications..

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Vous êtes totalement à côté de la plaque... en effet :
    La ligne de t_exemple dont l'id est 1234 est verrouillé pendant 20 secondes.
    Non ! En mode READ COMMITTED vous avez l'assurance que le SELECT lira des données validées. Une fois le SELECT effectué il peut se passer tout ce que l'on veut. Autrement dit une fois les données sont lues les verrous sont immédiatement libérés.
    Ce comportement est donc parfaitement logique et attendu...

    Si vous aviez lu mon livre sur SQL vous auriez vu quels sont les différents niveaux d'isolation de la norme SQL et ce que cela implique.
    Néanmoins, rien ne vous empêche de lire l'article que j'ai écrit au sujet des différents niveaux d'isolation normatifs et SQL Server, avec ses différentes démonstrations : http://www.sqlspot.com/Gerer-l-isola...nsactions.html

    Si vous utilisez le niveau REPEATABLE READ alors les verrous sont maintenus, mais cela n'empêche pas les anomalies transactionnelles venant de tuples fantômes...

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

  6. #6
    Membre actif
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Par défaut
    Bonjour SqlPro,


    Si vous saviez le nombre de fois ou vous m'avez aidé (sous différents pseudo)..

    Je vais commander votre livre dans la semaine..

    Merci

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

Discussions similaires

  1. [SQL SERVER 2000] Transaction, verrous et utilisation de NOLOCK
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/02/2009, 17h21
  2. Réponses: 2
    Dernier message: 20/09/2007, 11h28
  3. Réponses: 5
    Dernier message: 19/09/2007, 14h23
  4. gestion d'erreur et de transactions....
    Par Dge dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/02/2006, 22h20
  5. Apropos des Transactions au sein d'un Stored Procedure
    Par Sarbacane dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 16/11/2004, 08h21

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