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 :

insertion ou update selon le cas


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut insertion ou update selon le cas
    Bonjour,

    j'ai besoin de faire une insertion ou un update selon qu'un enregistrement existe ou pas. Mon ami google m'a alors proposé de faire un merge. Mon problème, c'est que cette requete peut etre executée (pour un meme enregistrement) en meme temps par 2 processus distincts. Du coup, un des 2 devrait faire une insertion puis l'autre un update.

    Résultat : une requete est executée et avant qu'elle soit finie, la meme est executée (meme id qui est une primary key !!). Du coup quand une des deux se finit, un enregistrement a été créé mais quand l'autre se termine, un autre est en train d'être crée (avec donc le meme id) mais évidemment, cela ne fonctionne pas (par contre, je n'ai aucune exception pour cela!!).

    Comment dois-je faire pour contourner ce problème ?

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je ne pense pas que tu est assez clair dans la description du problème ; l’emploi ou pas du merge ne devrait rien changer. Peux tu détailler ?
    Le fait que merge est exécuté simultanément pour le même id devrait générer une enregistrement dans une des sessions et échouer avec une violation du contrainte d’unicité dans l’autre.

  3. #3
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Quelle est la version Oracle ?


    mais est ce que la 2e transaction ne fait elle pas un update (car l'insertion a ete
    faite)
    c'est ptet pour ca qu'il n'y a pas demessage d'erreur ?

    fais voir le code ....

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Suite à ta remarque sur la précision de ma description, j'ai relancé des tests. Il arrive parfois que tout fonctionne bien (cela doit être parce qu'il y a eu un petit temps mort qui a permis à une des requetes de s'executer), parfois j'ai deux insertions et parfois j'en ai une des deux qui ne produit aucun resultat (pas de violation du contrainte d’unicité).

    Je me demande quel genre de verrou est posé lors d'un merge ?

    Ne devrais-je pas verrouiller la table ? Si oui, comment ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    fatsora : j'ai mis du temps à répondre et je n'avais pas vu ton message...

    Le problème, c'est que j'ai 3 comportements possibles et je ne m'explique pas pourquoi.

  6. #6
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    essaie ca

    quand il n'y a pas de violation, c'est ptet des updates ?



    http://www.quest-pipelines.com/newsletter-v4/0903_D.htm

    il permet de voir les lignes updates, insérés


    quelle version oracle utilises-tu ?

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Essayez peut-être de mettre du cache au niveau de la séquence qui gère la PK.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Je rectifie ce que j'ai dit auparavant car après d'autres tests, je n'ai que 2 cas : soit j'ai un insert puis un update (bien ce que je veux), soit j'ai 2 insert (en fait, je n'ai pas d'id qui s'incrémente automatiquement, je le fais à la main avec une sequence lors d'un insert dc il ne peut y a voir de violation de contrainte d'unicité).

    Le problème doit dc etre sur le niveau de lock de mes merge, non ?

    PS : désolé, j'ai l'impression d'être lundi matin très tôt...^^

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par crischprolch Voir le message
    je le fais à la main avec une sequence lors d'un insert dc il ne peut y a voir de violation de contrainte d'unicité
    Par contre tu devrais avoir une contrainte d'unicité sur tes clés candidates, la PK numérique permettant juste de simplifier la mise en relation des tables.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Par contre tu devrais avoir une contrainte d'unicité sur tes clés candidates, la PK numérique permettant juste de simplifier la mise en relation des tables.
    Désolé mais je ne comprends pas ce que tu veux dire par-là...

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par crischprolch Voir le message
    Je rectifie ce que j'ai dit auparavant car après d'autres tests, je n'ai que 2 cas : soit j'ai un insert puis un update (bien ce que je veux), soit j'ai 2 insert (en fait, je n'ai pas d'id qui s'incrémente automatiquement, je le fais à la main avec une sequence lors d'un insert dc il ne peut y a voir de violation de contrainte d'unicité).
    ...
    Voilà les comportements à attendre pour ce type de situation (en fait le deuxième cas échoue avec violation de contraint d'unicité). Mais que veux tu obtenir en fait ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Voilà les comportements à attendre pour ce type de situation (en fait le deuxième cas échoue avec violation de contraint d'unicité). Mais que veux tu obtenir en fait ?
    En fait non, car seul le premier cas est normal (je rappelle que mes processus travaillent sur un seul enregistrement). En fait cela signifie que lorsque le processus qui se déclenche en 2° teste la clause "on" du merge, il ne prend pas en compte le résultat du premier (en tt cas, il ne voit pas l'insert du premier). D'où ma question sur un éventuel lock...

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par crischprolch Voir le message
    En fait non, car seul le premier cas est normal (je rappelle que mes processus travaillent sur un seul enregistrement). En fait cela signifie que lorsque le processus qui se déclenche en 2° teste la clause "on" du merge, il ne prend pas en compte le résultat du premier (en tt cas, il ne voit pas l'insert du premier). D'où ma question sur un éventuel lock...
    C'est exactement comme ça que les choses doivent se passer! Vous voulez dire plutôt que cella ne vous convient pas!

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est exactement comme ça que les choses doivent se passer! Vous voulez dire plutôt que cella ne vous convient pas!
    Le merge que j'ai fait a pour but de créer un enregistrement si la clause "on" n'est pas vérifiée ou de l'updater sinon. Je pense que c'est plus un problème de timing (la deuxième requête arrive trop tôt pour voir le résultat de la première). J'espère m'exprimer clairement...

  15. #15
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    as tu essayé ceci



    Date d'inscription: février 2006
    Messages: 68

    Par défaut
    essaie ca

    quand il n'y a pas de violation, c'est ptet des updates ?



    http://www.quest-pipelines.com/newsletter-v4/0903_D.htm

    il permet de voir les lignes updates, insérés


    quelle version oracle utilises-tu ?

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par fatsora Voir le message
    as tu essayé ceci



    Date d'inscription: février 2006
    Messages: 68

    Par défaut
    essaie ca

    quand il n'y a pas de violation, c'est ptet des updates ?



    http://www.quest-pipelines.com/newsletter-v4/0903_D.htm

    il permet de voir les lignes updates, insérés


    quelle version oracle utilises-tu ?
    Non je n'ai pas pris le temps d'essayer cela...

    Quant à la version d'oracle, c'est la 10 si je ne m'abuse.

  17. #17
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    La table T ne contient pas l’enregistrement de ID 100.
    La session A exécute le merge pour le ID 100. Comme cette enregistrement n’existe pas elle fait l’insert. A peu près dans le même temps la session B exécute le merge.

    Si la session A a fait le commit alors la session B voit l’enregistrement et fait un update.
    Si la session A n’a pas encore fait le commit le niveau d’isolation d’Oracle par défaut (read commited) garanti que la session B ne voit pas l’enregistrement inséré par A et donc fait un insert et bloque. Quand la session A exécute le commit la session B échoue avec violation de contrainte d’unicité. Si la session A exécute rollback la session B abouti.

    Si ce comportement ne vous convient pas vous devez utiliser des verrous pour sérialiser les deux transactions.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Merci.

    C'est effectivement ce qui doit se passer. Je pense que je vais utiliser des verrous pour empêcher B d'écrire tant que A n'a pas fini, en espérant que ça ne pénalise pas trop les performances.

    Merci à tous pour votre aide (je ne peux pas tester cette solution pour le moment mais j'essaierai très bientôt...)

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/01/2008, 16h58
  2. [Debutant] Insert ou update...
    Par kluh dans le forum Oracle
    Réponses: 15
    Dernier message: 13/07/2005, 15h35
  3. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 16h40
  4. [Débutant][PS] modifier un insert en update
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/05/2004, 17h33
  5. Réponses: 2
    Dernier message: 05/01/2004, 12h23

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