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

Interfaces de programmation Oracle Discussion :

[PRO*C] LOCK TABLE


Sujet :

Interfaces de programmation Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut [PRO*C] LOCK TABLE
    Bonjour,

    Je voudrais savoir si il est possible de forcer le lock d'une table en Pro*C.

    Ma problématique est la suivante.

    J'ai des messages SWIFT multiples (MT700+MT701) ou si vous préférez, une séquence de messages composée de n messages.
    Je dois insérer ces messages dans une table ORACLE (version 10g).

    Ce qui est vraiment important pour moi est d'insérer l'intégralité de la séquence sans qu'une autre transaction vienne toucher à la table tant que le commit n'est pas fait.

    Mon idée est de locker la table, faire ma série d'Insert puis de faire mon commit à la fin de la séquence d'Insert ce qui logiquement doit délocké la table.

    Si je ne me trompe pas, Pro*c ouvre une transaction à chaque exécution de la commande EXEC SQL ..., or je voudrais une transaction ou je puisse faire n EXEC SQL INSERT avant de refermer la transaction via un COMMIT ou ROLLBACK.

    Si quelqu'un sait m'indiquer comment procéder ... ??? ou a une autre méthode pour cela ...

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Si je ne me trompe pas, Pro*c ouvre une transaction à chaque exécution de la commande EXEC SQL
    Non, Pro*C comme tout client SQL gère les transactions.

    Par contre, je trouve assez hard de locker toute la table.
    Que veux-tu dire exactement par
    sans qu'une autre transaction vienne toucher à la table
    ?
    Sans locker la table, les autres transactions ne verront pas les lignes insérées tant que tu n'as pas commité, ni ne pouront insérer des lignes avec la même clé. N'est-ce pas suffisant ?

    Cordialement,
    Franck.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    Tout d'abord merci pour la réponse rapide.

    En fait un process peut être lancé par les utilisateurs qui vient lire la table cible et manipuler les messages insérés.

    Mon soucis est que ce process utilisateur n'utilise pas les nouveaux messages inséré tant que ma séquence d'insertion n'est pas compléte autrement dit que les n messages de ma séquence soient insérés dans la table.

    si par exemple j'ai une séquence de 3 messages et que j'ai déja inséré 2 messages sur ma séquence, le process utilisateur ne doit pas pouvoir consulter ces deux premiers messages tant que le 3ème n'est pas inséré.

    Merci pour le coup de main.

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    un simple commit une fois les messages de la sequence intégrés suffit...

    je vois pas ou est le souci
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    si par exemple j'ai une séquence de 3 messages et que j'ai déja inséré 2 messages sur ma séquence, le process utilisateur ne doit pas pouvoir consulter ces deux premiers messages tant que le 3ème n'est pas inséré.
    C'est la notion basique d'isolation des transactions: tant que la transaction qui insère les 3 messages n'est pas commitée, les autres sessions ne voient aucun des 3 messages.
    Cordialement,
    Franck.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    Merci pou vos réponses.

    Donc si je comprend bien, je m'en fait pour pas grand chose.

    La seule chose est qu'il m'a semblé lire dans la documentation Pro*c que chaque execution de la commande EXEC SQL ... ouvrait une transaction propre. or dans mon cas, je voudrais que mes 3 inserts fassent parti de la même transaction et donc faire un commit (ou rollback) global pour les 3 inserts.

    Pour cela je dois bien ouvrir explicitement une transaction avant de faire mes inserts puis une fois les inserts réalisés, je dois commiter ou rollbacker ma transaction.

    Je me trompe ?

    Encore merci pour votre aide.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    Je viens de relire la doc Pro*C...

    Autant pour moi, je ne devais pas être bien réveillé quand je l'ai lu la première fois.

    Donc effectivement, tant qu'un commit n'est pas explicitement exécuté, Oracle considére toute action (nécessitant un commit ou rollback) comme appartenant à la même transaction. De plus, les actions ne sont pas visible aux autres utilisateurs tant que la transaction n'est pas commitée.

    Bon ben voila, problème résolu.

    En tout cas merci à tous pour votre aide et surtout pour votre patience.

    Promis, la prochaine fois je relirai 3 fois avant de poster.

    Encore merci.

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

Discussions similaires

  1. Lock table
    Par amelie6 dans le forum Oracle
    Réponses: 8
    Dernier message: 03/09/2011, 16h29
  2. [Hibernate] LOCK TABLE WRITE ?
    Par n!co dans le forum Hibernate
    Réponses: 11
    Dernier message: 22/01/2007, 13h12
  3. syntaxe de lock tables
    Par pas30 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 31/12/2006, 00h54
  4. Lock Table ?
    Par 000 dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/05/2006, 13h51
  5. LOCK TABLES et TRUNCATE TABLE
    Par killy-kun dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/08/2005, 15h52

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