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 :

Problème de lock


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut Problème de lock
    Bonjour à tous,

    J'ai un problème que je n'arrive pas à comprendre et j'espère que vous allez pouvoir m'aider ...
    J'ai un SI avec plusieurs tables structurées de la même manière. Dans chacune d'entre elles je stocke plusieurs versions de ma data.

    Coté intégration, j'ai un service Windows qui intègre en multithreading la data dans ces tables dites "splittées".
    Dès lors que l'intégration est terminée, toujours en multithreading, je lance une procédure stockée qui intègre dans une table consolidée la version la plus à jour de la data en faisant un simple delete / insert.

    Tout fonctionne bien sauf lorsque j'intègre trop de ligne d'un coup (plusieurs milliers). J'ai l'impression que SQL Server me met un lock sur ma table consolidée.
    Du coup si j'essaie de faire un simple "select" sur la table consolidée pendant l'insertion ça mouline, je n'ai plus la main ...

    Plusieurs questions:
    1. Comment voir si j'ai un lock sur ma table ?
    2. Pourquoi le lock ne s'activerai que sur des grosses insertions ?
    3. Du moment ou je fais du delete / insert je ne devrai pas avoir de problème d'intégrité, est-ce propre de consolider avec le mot clé WITH NO LOCK ?
    4. Comment faire du NO LOCK sur un DELETE / INSERT ?

    Merci pour vos suggestions

  2. #2
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Pfeffer Voir le message
    Plusieurs questions:
    1. Comment voir si j'ai un lock sur ma table ?
    2. Pourquoi le lock ne s'activerai que sur des grosses insertions ?
    3. Du moment ou je fais du delete / insert je ne devrai pas avoir de problème d'intégrité, est-ce propre de consolider avec le mot clé WITH NO LOCK ?
    4. Comment faire du NO LOCK sur un DELETE / INSERT ?
    1. https://blog.developpez.com/babaluga...-sur-une-table
    2. à cause du mécanisme d'escalade de verrous. https://blog.developpez.com/elsuket/...ade-de-verrous
    3. pourquoi pas, tu risques simplement un phénomène de lectures sales. http://rudi.developpez.com/sqlserver...ation/#LII-D-2
    4. impossible, la cohérence des données est en jeu. Les modifications verrouilleront toujours. Tu pourrais jouer avec une désactivation de l'escalade des verrous, mais ce n'est pas une bonne idée, SQL Server risque de consommer beaucoup plus de ressources et tu le sentiras sur les performances.


    Quelle est ta version et édition de SQL Server ? In-Memory OLTP pourrait être une option pour toi.

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Quelle est ta version et édition de SQL Server ? In-Memory OLTP pourrait être une option pour toi.
    Si pas SQL Server 2014 Enterprise ou SQL Server 2016 SP1, découper l'insertion en plus petits lots :
    • se fait en général dans le même temps
    • en limitant voire éliminant l'escalade de verrous
    • en évitant un gonflement de la taille du fichier du journal des transactions


    @++

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Pfeffer Voir le message
    j'ai un service Windows qui intègre en multithreading la data dans ces tables dites "splittées".
    L'ordre des opérations effectuées à l'intérieur de chaque thread a aussi son importance, il est parfois même capital pour éviter les inter-blocages entre les différentes sessions SQL Server chacune rattachée à un thread différent.

    Parfois, dans une transaction, si cela est possible, il faut commencer par mettre à jour les données (INSERT, UPDATE) avant de lire les données (SELECT) etc.
    Cela peut apparaître de prime abord surprenant, mais cela devient aisément compréhensible si on maitrise le fonctionnement interne des verrous, de bas niveaux, mis en œuvre pour assurer le caractères ACID des transactions, par exemple dans le niveau d'isolation par défaut READ COMMITTED.

    Il faut aussi veiller à ce que les transactions soient les plus "brèves", c.à.d. les plus courtes possibles. Cela rejoint l'idée du "découpage en petits lots" suggérée, à juste titre, par elsuket.

    Voilà, n'ayant aucune information détaillée sur la nature de vos traitements multithread, je ne peux vous assurer que cela résoudra votre problème (?) Mais c'est une piste à explorer.

    A+

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

Discussions similaires

  1. Problème de LOCK MySQL
    Par Sindel dans le forum MySQL
    Réponses: 6
    Dernier message: 18/10/2009, 01h45
  2. [WD12] Problème de locking
    Par samus535 dans le forum WinDev
    Réponses: 6
    Dernier message: 09/04/2009, 20h55
  3. [10g] Problème de LOCK
    Par salim11 dans le forum Forms
    Réponses: 6
    Dernier message: 05/09/2008, 20h17
  4. Réponses: 4
    Dernier message: 07/03/2008, 09h40
  5. Problème de lock d'un objet recordset
    Par aircamus dans le forum IHM
    Réponses: 2
    Dernier message: 12/06/2006, 14h17

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