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

PostgreSQL Discussion :

Autre probleme d'insert


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 133
    Points : 59
    Points
    59
    Par défaut Autre probleme d'insert
    Salut

    Comment faire contre le probleme d'insertion simultané ?
    2 personnes insert en même temps et la patatra c'est la catastrophes

    Donc mon prog je selectionne le max de la tables, j'ajoute 1 et ensuite j'insère...
    du coup, le probleme semble logique...

    que faire ?
    - serial ?
    - transactions ?

    merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 133
    Points : 59
    Points
    59
    Par défaut
    je regarde du coté desz verrous (lock)
    quelqu'un peut il m'en dire plus la dessus ?

  3. #3
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Si c'est un entier, le top est de prendre un type serial, c'est prevu pour, sinon met tes requetes en transaction
    :
    begin
    insert ....;
    commit;

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 133
    Points : 59
    Points
    59
    Par défaut
    la transaction simple ne suffit pas et pour le serial, ce n'est pas une suite d'entier (il y a des conditions)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN WORK;
    LOCK TABLE aa IN EXCLUSIVE MODE;
    SELECT id FROM a 
        WHERE ....
    INSERT INTO a VALUES ...
    COMMIT WORK;
    ça, ça à l'air de marcher après plusieurs test, mais comment en être sur
    Si j'ai bien compris, un verrou est posé et les autre attendent leur tour... puis une fois le verrou déposé, le premier le reprend etc...

    est ce ça ?

  5. #5
    Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 34
    Points : 42
    Points
    42
    Par défaut
    Salut,
    Pour ma part , j'utilise les sequences, une sequence c'est une sorte de fonction qui te retourne un numero incrementer ceci pour eviter les utilisation des max:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(macolonne) from matable
    tu creer d'abord une sequence


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      CREATE SEQUENCE masequence
      INCREMENT 1
      MINVALUE 1
      MAXVALUE 9223372036854775807
      START 1
      CACHE 1;
    Chaque fois qu'on apelle cette sequence sa valeur sera mis a jour et là il n'aura plus de
    patatra c'est la catastrophes
    ensuite quan tu insert un nouvel enregistrement
    tu tape:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select (nextval('masequence')) from matable
    Sinon si tu as plusieurs insertion tu recuperes dans une variable la valeur de ta sequence grace à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select (nextval('masequence'))
    et ensuite cette variable tu peu les utiliser pour les clé etrangeres

    Je ne sais pas si j'ai été claire par contre regarde cette article
    http://dgriessinger.developpez.com/p...sql/sequences/

  6. #6
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Peux tu nous donner un exemple de generation ? l'algo ?
    j'ai peut etre une piste : sequence + procedure stockée

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 133
    Points : 59
    Points
    59
    Par défaut
    merci pour vos réponses mais ma solution fonctionne niquel (ouf )
    je vais donc la garder mais à l'avenir je pense que je regarderai plutot du coté de vos solutions, car les verrous c'est un peu le bordel et ça peut vite provoquer des inter blocages.

    merci encore

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/07/2004, 01h27
  2. Probleme d'insertion dans la base de données
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 11/06/2004, 17h21
  3. probleme d'INSERT INTO et JavaScript
    Par Matlight dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/03/2004, 16h36
  4. autre probleme pour deriver fonction
    Par voyageur dans le forum Mathématiques
    Réponses: 15
    Dernier message: 28/07/2003, 15h37
  5. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 13h32

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