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 :

création d'une transaction de facturation


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 34
    Points
    34
    Par défaut création d'une transaction de facturation
    Bonjour je souhaite utiliser postgresql pour faire un soft de facturation, voici le synoptique de la fonction nouvelachat:

    -debut d'une transaction

    -créer nouvel facture avec facture_ID (serial) ;

    -créer de nouvel ligne de facture avec idfacture(facture_ID);

    -commiter la transaction ou faire un rollback.


    Je voudrais savoir si:

    -cela peut se faire?

    -l'incrementation de ID et son ajout dans les lignes de facture ne se fait qu'au moment du commit (afin de m'éviter de perdre des numéros)?

    en vous remerciant d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    logiquement oui, regardez du côté de la clause "returning" lors d'un insert.

    l'incrementation de ID et son ajout dans les lignes de facture ne se fait qu'au moment du commit (afin de m'éviter de perdre des numéros)?
    Ceci n'a pas de sens.
    La clef primaire se doit d'être unique dans votre table, de ce fait la séquence associé à votre ID sera incrémentée systématiquement lors d'une demande d'insert.

    Si vous avez un rollback celle-ci ne se décrémentera pas.

    En effet, prenons un exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    début de transaction A (TA)
    début de transaction B (TB)
    TA incrémente le serial
    TB incrémente le serial
    TB commit
    TA rollback

    Si, lors du rollback de TA, la séquence se remet à l'ancienne valeur lors de la demande d'incrémentation de TA vous allez avoir un problème au prochain insert.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Tout d'abord merci de votre réponse, n'étant pas un spécialiste de postgresql n'y aurait il pas moyen de forcer le comportement suivant.

    -TA(insert num facture)
    -TB(insert n lignes de facture liées avec IDfacture)
    -commit TA+TB
    -rollback TA+TB

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Non, une fois commité vous ne pouvez plus rollbacké.


    De plus pour pouvoir faire en simultané un commit ou rollback entre 2 transactions liées il va falloir utiliser des transactions distribuées (XA) par exemple.


    Par contre, votre schéma n'est-il pas plutôt comme ceci ?
    TA
    création commande
    création lignes
    commit TA ou rollback TA

    ou
    TA
    création commande
    commit TA ou rollback TA

    TB (si pas de rollback de TA)
    création lignes
    commit TB

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    La séquence garantit l'unicité des valeurs, mais pas que les valeurs se suivent exactement (il peut y avoir des trous).
    Pour des numéros de facture on ne peut pas utiliser une séquence à cause de ça.

    Une solution possible est d'utiliser un compteur dans une colonne qui sera verrouillé par la transaction qui créé une nouvelle facture:
    1) verrouillage compteur de facture
    2) incrémentation compteur de facture
    3) insertion facture
    4) commit (qui déverouille implicitement le compteur)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Désolé j'ai fait une petite erreur voici ce que je voulais schématiser:
    -TA(insert num facture)
    -TB(insert n lignes de facture liées avec IDfacture)
    -submit TA+TB
    -rollback TA+TB ou commit

    est ce faisable et est ce que cela me garantirait de ne pas avoir des trous dans mes IDfacture?

    Je ne sais pas si la solution du verrou est envisageable car l'application est sensée être multi-utilisateur, ce verrou ne risque-t il pas de bloquer les autres usagers?

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Si vous utilisez un serial (qui est une séquence) pour générer vos numéro de facture vous aurez des trous quoi que vous fassiez.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par kuntagp Voir le message
    Je ne sais pas si la solution du verrou est envisageable car l'application est sensée être multi-utilisateur, ce verrou ne risque-t il pas de bloquer les autres usagers?
    Non car une transaction d'insertion de facture ne dure que quelques millisecondes donc personne n'est gêné sauf s'il y en a des milliers par seconde.
    Lorsque les utilisateurs sont en train de saisir, l'appli n'a encore ouvert aucune transaction.

    Il faut voir que d'une manière générale, des verrous sont posés implicitement par le SGBD quand on fait des écritures avec UPDATE et parfois INSERT, généralement ce n'est pas un problème, c'est une solution justement pour éviter des incohérences en multi-utilisateurs.
    D'ailleurs la manière la plus simple de verrouiller le compteur de facture est de faire un simple UPDATE dessus avec sa valeur actuelle plus un.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Merci de vos reponses je vais tenter de contourner le problème avec du code c++

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    Le fait d'avoir des "trous" de numération dans vos factures n'est pas un problème dans le sens ou vous pouvez justifier que cette facture a été annulée.
    Il faudra cependant emmètre une facture d'avoir pour contrebalancer la facture annulée.
    En bref, vous ne devez jamais rollbacker une facturation, quoi qu'il arrive, mais émettre une seconde facture d'avoir dont le total annule l'ensemble.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Création d'une séquence dans une transaction
    Par gangsoleil dans le forum PL/SQL
    Réponses: 2
    Dernier message: 16/01/2013, 09h24
  2. création d'une table facture
    Par noobyyy dans le forum Requêtes
    Réponses: 5
    Dernier message: 16/09/2010, 14h47
  3. Création d'une facture
    Par digofwall dans le forum VB.NET
    Réponses: 21
    Dernier message: 04/04/2010, 03h47
  4. Réponses: 3
    Dernier message: 30/11/2009, 20h33
  5. Création d'une facture avec formulaire
    Par neo2907 dans le forum Modélisation
    Réponses: 6
    Dernier message: 20/10/2008, 21h44

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