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 :

Verrou transaction sur incrémentation?


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Verrou transaction sur incrémentation?
    Bonjour je suis nouveau sur le forum, je vous passe le bonjour à tous.
    Je me suis souvent servit de ce forum qui m'a apporté de nombreuses réponses durant mon expérience de développeur, les réponses les plus pertinentes que j'ai vu!

    Je post aujourd'hui car je suis un peu perdu. J'ai des valeurs qui s'incrémente de manière "incohérente" au sein d'une transaction, sans doute quelque chose que je n'ai pas saisi sur les transactions...?

    Voici en gros mon problème:
    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
     
    $erreur_insert = false;
     
    $connex->query("BEGIN");
     
    $connex->query("INSERT INTO article_vu SET WHERE id_article='".$article["id_article"]."'");
    if($connex->status() != 1) //affected rows
    {
        $erreur_insert = true;
    }
     
    $connex->query("UPDATE article_cfg SET (nb_vu = nb_vu + 1) WHERE id_article='".$article["id_article"]."'");
    if($connex->status() != 1) //affected rows
    {
        $erreur_insert = true;
    }
     
    if(!$erreur_insert)
    {
        $connex->query("COMMIT");
    }
    else
    {
        $connex->query("ROLLBACK");
    }
    Ma question est la suivante: Comment ce fait-il que, au bout de pas mal d'article vu le nombre d'enregistrement dans article_vu soit inférieur à nb_vu dans article_cfg?

    Es ce véritablement impossible? J'ai vérifié mon code de nombreuses fois à tête reposé et tout me semble correct.

    Si vous avez des idées je vois écoute avec attention!!

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Bonjour,

    Essayez de vous limiter au SQL. Le code client n'est pas intéressant.

    Qu'est sensée faire cette requête ? Je ne connais pas cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO article_vu SET WHERE id_article='xx'

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    A oui pardon, petite erreur de ma part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BEGIN;
     
    INSERT INTO article_vu ("id_article_vu","id_article",...) VALUES ('','XX',....);
    UPDATE article_cfg SET (nb_vu = nb_vu + 1) WHERE id_article='XX';
     
    COMMIT;

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Si les requêtes exécutées étaient bien celles que vous aviez copié collé de votre code alors c'est normal que ça ne fasse rien de bon.

    Là vous dites avoir fait une erreur mais on ne sait pas où quand comment, si vous avez re testé depuis ...

    Bref re présentez votre problème de manière complète si vous voulez être aidés et ne pas faire perdre de temps aux autres :

    - Version de base de données
    - Script de création des tables
    - Script de création du jeu de données
    - Résultat attendu
    - Requêtes exécutées
    - Résultat obtenu

    Merci

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Si les requêtes exécutées étaient bien celles que vous aviez copié collé de votre code alors c'est normal que ça ne fasse rien de bon.
    Là vous dites avoir fait une erreur mais on ne sait pas où quand comment, si vous avez re testé depuis ...
    Je n'ai pas le code sous la main, je l'ai fait de mémoire et sans doute trop vite en effet... désolé vmolines

    J'utilise postgresql 8.3 sur debian avec phppgadmin, je posterai le détail quand je serais chez moi, si je met mes create table de tête je vais encore faire des erreurs.

    Le résultat attendu est juste d'avoir une visualisation rapide du nombre d'enregistrement de la table article_vu dans articel_cfg sans avoir a faire un count ou un pg_affected_rows (php) et que le résultat soit correct!!

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Voila un exposé complet:

    Les tables:
    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
     
    CREATE TABLE pub_forfait (
        id_pub_forfait SERIAL PRIMARY KEY,
        id_pub INTEGER NOT NULL REFERENCES pub ON DELETE CASCADE,
     
        ...
     
        nb_pub_vu integer CHECK( nb_pub_vu >= 0 ) NOT NULL,
        nb_pub integer CHECK( nb_pub >= 0 ) NOT NULL,
        fini boolean NOT NULL
    );
     
    CREATE TABLE pub_vu_non_log (
        id_pub_vu_non_log SERIAL PRIMARY KEY,
        id_pub_forfait INTEGER NOT NULL REFERENCES pub_forfait ON DELETE CASCADE,
        ...
    );
     
    CREATE TABLE pub_vu (
        id_pub_vu SERIAL PRIMARY KEY,
        id_pub_forfait INTEGER NOT NULL REFERENCES pub_forfait ON DELETE CASCADE,
        ...
     
    );
    exemple nouvelle pub vu non loggué:
    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
     
    BEGIN;
    INSERT INTO pub_vu_non_log (
    id_pub_vu_non_log,
    id_pub_forfait,...
    )
    VALUES(
    nextval('pub_vu_non_log_id_pub_vu_non_log_seq'), 'XX' ,...);
     
    UPDATE pub_forfait SET nb_pub_vu = (nb_pub_vu + 1) WHERE id_pub_forfait = 'XX';
     
    -- je sais que je pourrais compter les enr dans les pub_vu à la place
    SELECT id_pub_forfait FROM pub_forfait 
    WHERE id_pub_forfait = 'XX' 
    AND nb_pub_vu >= nb_pub;
     
    -- if nb row == 1
    UPDATE pub_forfait SET fini = true WHERE id_pub_forfait = 'XX';
     
    --if pas d'erreur
    COMMIT;
    --else
    ROLLBACK;
    J'imagine qu'il doit y avoir des manière plus élégante de le faire si vous avez des suggestions... cependant ma question n'est pas là.

    mon problème au final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM pub_vu_non_log WHERE id_pub_forfait = 'XX';
    -- Additionné a 
    SELECT * FROM pub_vu WHERE id_pub_forfait = 'XX';
    est différent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nb_pub_vu FROM pub_forfait WHERE id_pub_forfait = 'XX';
    Normalement la transaction devrait garder la cohérence que ca commit ou pas?
    Merci de votre aide.

Discussions similaires

  1. Pb Transaction sur ConstraintViolationException
    Par perezoso dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/08/2007, 13h43
  2. suppression des fichiers de transactions sur exchange 2003
    Par rajaa.at dans le forum Exchange Server
    Réponses: 0
    Dernier message: 01/08/2007, 11h40
  3. [VB.NET] Transaction sur plusieurs DB
    Par olbi dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/05/2007, 08h23
  4. [WD11] Transactions sur Accès natif Oracle
    Par AnneC dans le forum WinDev
    Réponses: 4
    Dernier message: 18/04/2007, 15h03
  5. [Global temporary]Transaction sur table temporaire
    Par tanatiel dans le forum Oracle
    Réponses: 9
    Dernier message: 12/10/2005, 16h38

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