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 :

Blocage lors d'un delete


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut Blocage lors d'un delete
    Bonjour,

    J'ai une table dont la clé primaire est composé de deux colonnes (TYPE + NUMERO) :

    Matable (
    TYPE char(2)
    NUMERO INT
    LIBELLE char(50)
    )

    Je vais en modification sur une ligne de ma table, j'ouvre une transaction et je bloque la ligne (ROWLOCK + UPDLOCK) pour TYPE = 'A' & NUMERO = 1
    Si je veux simultanément faire une suppression de toutes les lignes avec TYPE = 'B' j'obtiens un blocage LCK_M_U.
    Si je supprime unitairement les lignes qui ont TYPE = 'B' ça fonctionne.
    Pourquoi ne puis-je pas faire un delete de masse alors que le ROWLOCK est appliqué ?
    Aucune aide par MP, utilisez le forum.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Quels sont les verrous posés sur ta table lorsque tu ouvres une transaction et que tu "bloques" ta ligne ?

    Que te donne le résultat de la DMV sys.dm_tran_locks ?

    ++

  3. #3
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    Résultat de sys.dm_tran_locks.

    OBJECT 5 1057789409 0 IX LOCK GRANT 1 33554432 63 0 0 TRANSACTION 1193355 00000000-0000-0000-0000-000000000000 0x13CFADD0:1:1 0x2EBE4800
    METADATA DATABASE_PRINCIPAL 5 principal_id = 1 0 0 Sch-S LOCK GRANT 6 33554432 63 0 0 TRANSACTION 1193355 00000000-0000-0000-0000-000000000000 0x13CFADD0:1:1 0x3EC57100
    KEY 5 (a900d22343af) 7,20576E+16 0 U LOCK GRANT 0 33554432 63 0 0 TRANSACTION 1193355 00000000-0000-0000-0000-000000000000 0x13CFADD0:1:1 0x2EBE6DE0
    Aucune aide par MP, utilisez le forum.

  4. #4
    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
    Pourquoi voulez-vous verrouiller à la main ce que le SGBDR fait, bien mieux que vous de manière optimisé et performant ?

    Laissez le faire. Une INSERT, UPDATE ou DELETE est une transaction !

    A lire sur ce qu'est une transaction : http://sqlpro.developpez.com/cours/sqlaz/techniques/

    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. #5
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    Le verrouillage à la main me sert à bloquer des fiches de saisies pour qu'un seul utilisateur puisse modifier une fiche.
    Aucune aide par MP, utilisez le forum.

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    En principe si tu n'as pas besoin de forcer le mode de verrouillage dans ton cas. Le verrouillage se fera automatiquement au niveau ligne (ou clé ici) si ton prédicat est suffisamment sélectif.

    Et que te donne un sys.dm_tran_locks lorsque tu tentes ta suppression en masse ?

    ++

  7. #7
    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
    Vous êtes donc en traine de vous auto bloquer...

    Vous ne pouvez pas à la fois bloquer en lecture et bloquer en écriture. Un verrou de lecture bloque les écritures et vice versa...

    Je pense que vous devriez vous former au SGBD rerlationnel. On est pas dans du cobol avec des fichiers et des lignes !!!!

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

  8. #8
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    J'avais compris que je m'auto bloqué, mais je trouve ça quand même extraordinaire de ne pas pouvoir bloquer une ligne d'un enregistrement et dans supprimer 10 autres en mêmes temps ...
    Aucune aide par MP, utilisez le forum.

  9. #9
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    C'est tout à fait possible. Cela fonctionne à certaines conditions. Il faut simplement voir quel est le mode de verrouillage utilisé par vos 2 transactions.

    ++

  10. #10
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    Quelle mode de verrouillage faut il utiliser pour effectuer cette manipulation ?
    Aucune aide par MP, utilisez le forum.

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Il faut simplement voir quel est le mode de verrouillage utilisé par vos 2 transactions.
    Répondez à la question au lieu qu'en poser une autre...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    Puisque cela fonctionne à certaine condition, autant me donner les verrouillages qui fonctionne plutôt que j'explique mes verrouillage qui ne fonctionne pas pour qu'on me dise de faire autrement, c'est quand même plus simple.
    Aucune aide par MP, utilisez le forum.

  13. #13
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Je pense qu'il faut revenir à ton besoin avant de te répondre.

    Que veux-tu faire précisément au niveau fonctionnel ...

    Une personne qui rentre dans une fiche doit pouvoir la "bloquer" si j'ai bien compris (une fiche est représentée par une ligne de données dans notre cas).
    Maintenant si une autre personne entre sur cette même fiche que se passe-t-il ? Il peut lire les données ? Il est bloqué ? Un message d'erreur ou d'information doit lui arriver et lui signaler que quelqu'un d'autre gère déjà cette même fiche ?

    Peux-tu nous en dire plus ?

    ++

  14. #14
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    Quand on arrive sur une fiche, on bloque la fiche (ligne dans la table SQL (UPDLOCK + ROWLOCK), si un autre utilisateur arrive dessus, on essaye de bloquer la ligne, comme celle-ci est déjà bloqué on reçoit une erreur 1222 et on affiche un message "L'enregistrement est bloqué par un autre utilisateur".
    Ceci marche parfaitement depuis des années.
    Le problème c'est lorsque je veux faire un UPDATE ou DELETE de masse sur la table dont une ligne est bloqué, même si la ligne bloquée n'est pas concerné par cette UPDATE ou DELETE, celui ne s'exécute pas et est bloqué.
    Aucune aide par MP, utilisez le forum.

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

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par J0r_x Voir le message
    Bonjour,

    J'ai une table dont la clé primaire est composé de deux colonnes (TYPE + NUMERO) :

    Matable (
    TYPE char(2)
    NUMERO INT
    LIBELLE char(50)
    )

    Je vais en modification sur une ligne de ma table, j'ouvre une transaction et je bloque la ligne (ROWLOCK + UPDLOCK) pour TYPE = 'A' & NUMERO = 1
    Si je veux simultanément faire une suppression de toutes les lignes avec TYPE = 'B' j'obtiens un blocage LCK_M_U.
    Si je supprime unitairement les lignes qui ont TYPE = 'B' ça fonctionne.
    Pourquoi ne puis-je pas faire un delete de masse alors que le ROWLOCK est appliqué ?
    Attention, le hint n'est que la recommandation pour le moteur qui peut être ignorée.

    Alors, il est très probable, qu'il s'agit d'un "lock escalation".
    Vu le nombre des lignes à supprimer, le moteur descend du nivaux verrouillage "ligne" vers les pages et puis vers une table entière.

    Dans ce cas la solution possible est la suppression par lots i.e par 10 lignes dans un cycle.

  16. #16
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Alors, il est très probable, qu'il s'agit d'un "lock escalation".
    Effectivement il se peut que le type de verrou change et que du coup le DELETE se retrouve bloqué par un lock de type U. C'est la raison pour laquelle je demandais à J0r_x de nous donner un état de la DMV sys.dm_tran_locks en lançait ses 2 transactions.

    Quand on arrive sur une fiche, on bloque la fiche (ligne dans la table SQL (UPDLOCK + ROWLOCK), si un autre utilisateur arrive dessus, on essaye de bloquer la ligne, comme celle-ci est déjà bloqué on reçoit une erreur 1222 et on affiche un message "L'enregistrement est bloqué par un autre utilisateur".
    Ceci marche parfaitement depuis des années.
    Le problème c'est lorsque je veux faire un UPDATE ou DELETE de masse sur la table dont une ligne est bloqué, même si la ligne bloquée n'est pas concerné par cette UPDATE ou DELETE, celui ne s'exécute pas et est bloqué.
    Il y a d'autres manière plus propre de faire cela je pense en utilisant un système d'horodatage avec libération de la ressource au bout de X temps pour éviter qu'un utilisateur bloque trop longtemps une ressource. (Par exemple un utilisateur qui oublie de quitter une fiche en partant et verrouille sa session)

    ++

  17. #17
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    Il est pas possible d'éviter le lock escalation sans changer le type de verrouillage qui est déjà effectué ?
    Aucune aide par MP, utilisez le forum.

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

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par J0r_x Voir le message
    Il est pas possible d'éviter le lock escalation sans changer le type de verrouillage qui est déjà effectué ?
    Essais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE Matable SET LOCK_ESCALATION = DISABLE
    ce que ne garantie pas l'escalade dans 100% des cas quand même.

    Je suis plutôt d'accord avec mikedavem, il vaut mieux modifier la logique afin d'éviter les blocages directes (i.e. numéro de la version d'une ligne).

  19. #19
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    La méthode de version complexifie grandement la gestion et en plus cela n’empêche l'utilisateur de faire la modification de l'enregistrement que lors de l'UPDATE, alors qu'il a saisie les informations dans la fiche.

    EDIT :
    Le LOCK_ESCALATION = DISABLE n’empêche pas le blocage, après les tables ne sont pas partitionnées est-ce que ça a un rapport ?
    Aucune aide par MP, utilisez le forum.

  20. #20
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    En faisant ceci ça à l'air de fonctionner bizarre ...

    DELETE FROM Matable WHERE TYPE = 'B' AND NUMERO IN(
    SELECT TOP 10000 NUMERO FROM Matable WHERE TYPE = 'B')

    On va voir ce que ça donne dans le temps.
    Aucune aide par MP, utilisez le forum.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [jsp & Jdbc] Erreur dans ma page lors d'un delete
    Par critok dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/06/2008, 16h08
  2. Blocage lors de l'écriture dans un fichier
    Par yoyostras dans le forum Débuter
    Réponses: 7
    Dernier message: 26/06/2007, 15h16
  3. [Système] Blocage lors du lancement d'un script
    Par tintin22 dans le forum Langage
    Réponses: 9
    Dernier message: 17/02/2007, 12h30
  4. [jsp & Jdbc] Erreur dans ma page lors d'un delete
    Par critok dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/06/2006, 11h24
  5. problème de blocage lors de démarrage
    Par leo13 dans le forum Ordinateurs
    Réponses: 16
    Dernier message: 05/05/2006, 19h07

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