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

Bases de données Delphi Discussion :

gestion des transactions


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut gestion des transactions
    Bonjour à tous,
    J'ai un programme qui reçoit des trames depuis un périphérique. Le périphérique peut envoyer ses trames (des lignes de texte) par paquets.
    Pour chaque trame reçue, je fais en gros
    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
     
    LectureTrame
    if TrameOk then
    begin
      BeginTrans;
      try
        if TrameAutorise then
        begin
          RequeteInsert;
          RequeteUpdate;  
        end;
      //... écriture dans le log "OK"
      CommitTrans; 
      except
        on E:Exception do
        begin
          RollbackTrans;          
          //... écriture dans le log
        end;
    end;
    Le problème est que quand une exception survient, le Rollbacktrans m'annule les 800 précédentes transactions qui sont pourtant bien marquées comme ok dans le fichier de log.... je ne comprends pas d'où peut provenir le problème....

    Isa

  2. #2
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Je dirais que c'est normal comme comportement. Effectivement un RollbackTrans va annuler toutes les opérations effectuées depuis ton dernier BeginTrans (ou CommitTrans).

    Dans ton cas tu as deux possibillités.
    Soit tu effectues un CommitTrans toutes les 100 opérations par exemple et tu interromps ton traitement sur l'échec.
    Ou bien tu ne déclenches pas de RollBackTrans sur l'échec de la ligne pour laisser s'effectuer le traitement de toutes tes trames. Ensuite à toi d'effectuer un traitement particulier avec les informations contenues dans ton Log.

    Mais d'un autre côté je ne suis pas forcément très affuté sur les traitements par lot, donc attends peut-être l'avis d'autres sur la question.

    @+ Claudius

  3. #3
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Essaye avec ces modifications.

    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
    LectureTrame
    if (TrameOk AND TrameAutorise) then
    begin
      BeginTrans;
      try
        //if TrameAutorise then
        //begin
        RequeteInsert;
        RequeteUpdate;  
        //end;
        CommitTrans; 
        //... écriture dans le log "OK"
      except
        //on E:Exception do
         //begin
         RollbackTrans;          
         //... écriture dans le log
      end;
    end;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut
    Bonjour,
    Le programme dont je vous parle dans mon post d'origine est une .Dll
    Se pourrait-il que la dll soit appelée plusieurs fois en même temps ? Mais dans ce cas, comment "protéger" les transactions afin que quand une erreur survient, seule la transaction en court soit annulée mais pas toutes les précédentes....
    quand on écrit les trames dans un fichier texte au lieu d'essayer de les envoyer à la base de données, il n'y a aucun problème...

    Isa

  5. #5
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Je veux dire que si plusieurs transactions sont en cours simultanément, elles doivent avoir un numéro différent. Sinon quand il y a un rollback toutes celles qui ont le même numéro sont annulés. (Je dis ça après avoir regarder l'aide du TSQLConnection, mais je n'utilise pas les transactions).

  6. #6
    Membre chevronné Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Par défaut
    Tu crée une transaction pour faire le travail et tu la libère à la fin

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut
    Citation Envoyé par Linkin
    Je veux dire que si plusieurs transactions sont en cours simultanément, elles doivent avoir un numéro différent. Sinon quand il y a un rollback toutes celles qui ont le même numéro sont annulés. (Je dis ça après avoir regarder l'aide du TSQLConnection, mais je n'utilise pas les transactions).
    C'est très certainement ce qui se produit. Cependant je ne vois aucune propriété de mon objet de connexion me permettant de définir ou d'utiliser un numéro de transaction...
    d'un autre côté ça me semble un peu risqué de ne pas faire de rollback sur une erreur ou de ne pas utiliser du tout les transactions.... ?

    Isa

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. [ORACLE] : Gestion des transactions
    Par dcollart dans le forum Oracle
    Réponses: 5
    Dernier message: 07/07/2006, 08h49
  3. [Data] Gestion des transactions
    Par hlr dans le forum Spring
    Réponses: 2
    Dernier message: 21/02/2006, 09h47
  4. Gestion des transactions - Gestion des erreurs
    Par devdev dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 23/03/2005, 20h17
  5. gestion des transactions
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/03/2004, 21h53

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