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

SQL Oracle Discussion :

lock un block de data par un update?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Points : 59
    Points
    59
    Par défaut Expertise oracle sur les lock update et insert?
    Bonjour,

    1-(sous oracle 9ir2),j'ai des problemes de lock sur ma table, en fait j'ai 40 updates en Parallel sur une colonne MONTANT de la meme ligne i de la table X, donc les 40 restent en attente et ça me cree des deadlocks, quelqu'un a une solution pour ca svp?

    update tabale X set montant=montant+y where num=val

    2- un update/insert lock la ligne de la table ou toute la table?
    3 -update /insert lock t'ils tout le block de data ou les lignes sont hebergées?
    si oui, je vais forcer ma table de facon a mettre chaque lignes dans un block seul pour ne pas monopoliser ce block? pourriez vous mexpliquer svp????
    merci pour votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Points : 59
    Points
    59
    Par défaut lock un block de data par un update?
    Bonjour,

    Ma quesion est la suivante:

    un update ou insert sur une 1 ligne d'une table, est ce que oracle verouillera tout le block de données qui heberge cette ligne de cette table ou uniquemmet la partie du block concerné ?

    Oracle 9IR2,

    Merci d votre aide?

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    un update ou insert sur une 1 ligne d'une table,
    Avec quel outil ?
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    je te conseille la lecture du concept guide (chap 13)

    Oracle provides unique non-escalating row-level locking, c'est un de ses grabds avantages par rapport à d'autres db !!!

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ça ne sert à rien de recréer une discussion

    Pourquoi tu updates 40 fois la même colonne ?

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    quelle discussion ? je réponds à la question posée par la personne à savoir 'est-ce qu'oracle verrouille un block entier de données pour réaliser ses opérations'

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    j'ai fusionné 2 discussions créées par Mehdilis, c'est à lui que s'adresse ma remarque

  8. #8
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Est ce que tu a un vrai deadlock ou juste un verrou ?

    Citation Envoyé par Mehdilis Voir le message
    1-(sous oracle 9ir2),j'ai des problemes de lock sur ma table, en fait j'ai 40 updates en Parallel sur une colonne MONTANT de la meme ligne i de la table X, donc les 40 restent en attente et ça me cree des deadlocks, quelqu'un a une solution pour ca svp?

    update tabale X set montant=montant+y where num=val
    Pour ca il faut plus de précisions pour t'aider

    Citation Envoyé par Mehdilis Voir le message
    2- un update/insert lock la ligne de la table ou toute la table?
    Un update ou un insert verrou la ligne de la table en mode exclusive et toute la table
    en mode partagé.
    C'est normal qu'il verrou la ligne pour la coherence des données et de même il protège
    toute la table pour ne pas être supprimé par exemple.

    Citation Envoyé par Mehdilis Voir le message
    3 -update /insert lock t'ils tout le block de data ou les lignes sont hebergées?
    si oui, je vais forcer ma table de facon a mettre chaque lignes dans un block seul pour ne pas monopoliser ce block? pourriez vous mexpliquer svp????
    merci pour votre aide.
    Normalement il verrou les lignes, par contre, si le bloc contient plusieurs lignes ca va faire une contention sur le bloc (HOT BLOCK).

    Il y a un moyen pour mettre moins de ligne dans un bloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alter table nom_de_la_table minimize records_per_block;
    Autres choses vérifie le inittrans de ta table

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Points : 59
    Points
    59
    Par défaut
    Je vous remercie tous, dsl pour la double discussion, c’est pas fait exprès affet copie cloller. Un grand merci à Bouyao, en fait vous m’aviez donné une très bonne idée pour minimiser les lignes par table, et ça minimise les conflits, en fait j’ai crée aussi une autre table secondaire (fils)qui contient les mêmes lignes que la table primaire(père), mais pour chaque ligne du père sera dupliquée en N fois en fils, telle que la contrainte unique qui existait je lui ai rajoutée une séquence cyclique de 0àN-1 pour éviter le problème de Unique constraint, avec des lignes dupliquée et ça divise le nbre locks par N.

    1/ svp comment je peux savoir le nombre de lock et le nom des tables en cause, je cherche que dans le fichier alerte mais ne me donne pas assez d’info ?
    Le rapport Statspack pourra m’informer ?
    2/ Bonne idée aussi le initrans ou max trans comment je vais les variés en baisse ou en croissance ?merci de votre reponse

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    1/ v$lock, v$locked_object et v$session_wait (wait enqueue = lock)

    2/ ALTER TABLE mais je crains que ce ne soit pas rétro-actif

  11. #11
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Citation Envoyé par orafrance Voir le message
    2/ ALTER TABLE mais je crains que ce ne soit pas rétro-actif
    Voici un petit exemple

    Ici, je crée une table DVP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> create table dvp as select * from all_objects where rownum=1;
    Table created.
     
    SQL>  analyze table dvp compute statistics;
    Table analyzed.
     
    SQL> select table_name,num_rows,blocks from all_tables where table_name='DVP';
     
    TABLE_NAME                       NUM_ROWS     BLOCKS
    ------------------------------ ---------- ----------
    DVP                                     1          1
    On voit qu'une seule ligne tient dans un 1 seule bloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> insert into dvp select * from all_objects;
    61423 rows created.
     
    SQL> commit;
    Commit complete.
     
    SQL>analyze table dvp compute statistics;
     
    SQL> select table_name,num_rows,blocks from all_tables where table_name='DVP';
     
    TABLE_NAME                       NUM_ROWS     BLOCKS
    ------------------------------ ---------- ----------
    DVP                                 61424        910
    On voit que 61424 lignes se trouve dans 910 blocs, c.a.d une moyenne de
    67 lignes dans un seul bloc.


    Après, on crée une 2 emme table pareil que la première, seulement on ajoute l'option minimize records_per_block.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    SQL> create table dvp2 as select * from all_objects where rownum=1;
    Table created.
     
    SQL> alter table dvp2  minimize records_per_block;
    Table altered.
     
    SQL> analyze table dvp2 compute statistics;
    Table analyzed.
     
    SQL> select table_name,num_rows,blocks from all_tables where table_name='DVP2';
     
    TABLE_NAME                       NUM_ROWS     BLOCKS
    ------------------------------ ---------- ----------
    DVP2                                    1          1
     
    SQL> insert into dvp2 select * from all_objects;
    61423 rows created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> analyze table dvp2 compute statistics;
    Table analyzed.
     
    SQL> select table_name,num_rows,blocks from all_tables where table_name='DVP2';
     
    TABLE_NAME                       NUM_ROWS     BLOCKS
    ------------------------------ ---------- ----------
    DVP2                                61424      30716
    On a alors 61424 lignes dans 30716 blocs et ca fait une moyenne de 2 lignes par bloc.


    A savoir la taille de la table va être 30 fois plus grandes que la première.

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    je parlais de INITRANS et MAXTRANS

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 137
    Points : 59
    Points
    59
    Par défaut
    Merci de vos reponses et de vos exemples, j'ai arrivé a consulter les vues que vous m'aviez citées par contre il me reste le nombre de lock a connaitre svp?

  14. #14
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    En général les vues V$ ne permettent pas de lister tous les verrous demandés ou posés sur des lignes d'une table donnée car les verrous de niveau ligne ne sont pas stockés directement dans la SGA mais sont stockés dans les blocs des extents de la table. Si une transaction verrouille 1 ou 10000 lignes d'une même table, il y a aura seulement une ligne de type TX dans V$LOCK pour cette table. Ceci n'est pas assez détaillé dans la documentation officielle mais est bien détaillé par Tom Kyte sur AskTom et dans son livre "Expert Oracle".

  15. #15
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    bouyoa,

    J'ai trouvé ton explication sur l'option minimize records_per_block trés claire...merci.
    Dans la réalité, vaut-il mieux avoir plus ou moins de lignes par bloc ?

    Encore merci.
    LBO72.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/11/2006, 18h05
  2. [Oracle] Nombre de ligne affecté par un update
    Par vimanas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2006, 16h24
  3. [Oracle] Connaitre le nombre de lignes affectées par un update à l'avance
    Par lionheart33806 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 10/08/2006, 10h35
  4. [XML] Récupérer un XML data par le serveur
    Par naima2005 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 13/05/2006, 20h17
  5. [9i] Nombre de lignes affectées par un update
    Par yac dans le forum Oracle
    Réponses: 5
    Dernier message: 13/01/2006, 15h59

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