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 :

Interbase, threads et transactions


Sujet :

Bases de données Delphi

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut Interbase, threads et transactions
    Bonjour,

    Je suis grand débutant dans l'exploitation d'Interbase. J'ai à construire une application multithreadée accèdant à une base de données :

    - Un thread effectue des suppression dans la base de données,
    - Un thread consulte la base de données
    - Un thread effectue des modifications dans la base de données

    En fait, ces threads sont gérés par des serveurs TCP Indy et représentent des connexions clientes.

    Je me pose un problème au niveau de la gestion des transactions sur cette BD.
    Théoriquement, un même client devrait utiliser la même transaction, pour que les suppressions et les modifications puissent être COMMITés ou ROLLBACKées de manière cohérente... Et c'est là que je me pose la question : comment faire ?

    Chaque thread devrait avoir son TIbSQL, mais au niveau des TIbTransactions ? Dois-je gérer une liste (TList) de composants, et suivant le client du thread, assigner au TIbSQL la transaction qui lui est liée ? Au niveau du TIbDataBase, vu que normalement tous les threads se le partagent, puis-je utiliser le même pour tous les threads (est-ce threadsafe ?) Bref, au niveau de l'architecture, je sèche un peu.

    Si quelqu'un a déjà été confronté au même problèe...

    Cordialement,

    A.R.

  2. #2
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    J'ai un peu de mal à comprendre pourquoi les threads seraient spécialisés par action...
    Il me paraîtrait plus sage de dédier un thread à une transaction, ce qui résoudrait ton problème.
    L'idée (communément exploitée) est de créer un "pool" (une TList) d'objets database, et de poser un verrou sur l'objet utilisé jusqu'à sa fin d'utilisaton... Un objet gestionnaire de pool se chargeant de proposer un objet libre ou de mettre la requête en attente de libération d'un objet.
    Ainsi une transaction SQL s'exécuterait au sein d'un thread unique.
    Cordialement.

  3. #3
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Interbase, threads et transactions
    Citation Envoyé par Reisubar
    Je me pose un problème au niveau de la gestion des transactions sur cette BD.
    Théoriquement, un même client devrait utiliser la même transaction, pour que les suppressions et les modifications puissent être COMMITés ou ROLLBACKées de manière cohérente... Et c'est là que je me pose la question : comment faire ?
    Oui c'est préférable

    Citation Envoyé par Reisubar
    Chaque thread devrait avoir son TIbSQL, mais au niveau des TIbTransactions ? Dois-je gérer une liste (TList) de composants, et suivant le client du thread, assigner au TIbSQL la transaction qui lui est liée ?
    C'est une idée, le tout est de bien gérer les clients qui se deconnectent sans commiter ou rollbacker, votre Transaction associé à ce client va rester ouverte et si dedans il a fait des mises à jour de données, celà pourait poser problème. Au niveau de TIBTransaction on peu définir un timer aubout duquel il effectue un commit ou un rollback. C'est peut etre une solution pour bien fermer les transactions trop longues.
    De plus (Ca reste à vérifier) il faudra certainement gérer en plus de votre liste de transaction un TIBSQL (ouvert) associé à chacune de vos transactions ouverte. Car il me semble que s'il n'y a plus d'objet TIB attaché à une TIBTransaction, celle ci se ferme automatiquement en effectuant l'action par defaut (Commit si vous n'avez pas changer la config du TIBTransaction).
    Citation Envoyé par Reisubar
    Au niveau du TIbDataBase, vu que normalement tous les threads se le partagent, puis-je utiliser le même pour tous les threads (est-ce threadsafe ?) Bref, au niveau de l'architecture, je sèche un peu.
    Celà implique que tout vos clients utilisent le même compte USER pour accéder à la base de données. Pourquoi pas surtout si vous ne savez pas à l'avance combien de USER vont se connecter ou si vous ne voulez pas gérer les USERS avec la sécurité interbase mais d'une autre façon.
    Par contre je ne vois pas pourquoi utiliser le même TIBDataBase ne serait pas thread safe, vue que chaque thread utilisera sa propre transaction. La seule chose c'est si un thread fait planter la connexion (je ne sais pas pour quel raison) tout le monde est dans les choux d'un autre coté si c'est le serveur qui fait tomber les connexions je ne vois pas ce que ca changerai d'avoir plusieurs connexions.

    Maintenant il me semble que faire ce que préconise cmen76 est mieux, c'est à dire un thread non pas par type d'action mais plutot par action_metier. Cad une action qui peux intégrer des MAJ ou delete ou insert ou select et qui ont besoin d'être dans une transaction pour pouvoir être validée ou annulée dans son ensemble. Chaque client connecter instancierait son propre processus d'action metier.

    PS : Tu n'as pas l'impression de réinventer la roue ? Ca resemble à ce qu'on peux trouver sur un serveur d'application ce que tu veux faire non ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    J'ai un peu de mal à comprendre pourquoi les threads seraient spécialisés par action...
    Il me paraîtrait plus sage de dédier un thread à une transaction, ce qui résoudrait ton problème.
    C'est pour une application de contrôle de sources (un peu comme CVSUp). Faire plusieurs opérations en parallèle accèlère le traitement des opérations : pendant que mes clients TCP transfèrent des fichiers (un flux d'octets), un autre client TCP reçoit les fichiers à supprimer de la base, etc. Comme Indy (ma librairie Internet) suit un modèle threadé, chaque requête reçue sera forcément dans un nouveau thread. J'en conviens, c'est un peu bordélique. Si après effectivement tout se passe dans le même thread, il n'y a plus de problème puisque je crée mes composants dans chaque thread et que la transaction de la base est "calée" sur le déroulement du thread. Mais on perds les avantages de l'exécution asynchrone du processus.

    Merci pour vos précisions. Sur le papier, ca paraissait sympa, en réalité ça me semble un peu difficile à gérer ;-)

Discussions similaires

  1. [Framework] Thread et transaction
    Par pickeu dans le forum Spring
    Réponses: 4
    Dernier message: 15/06/2010, 19h17
  2. [delphi][interbase]problème de transaction
    Par daheda dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/10/2006, 09h12
  3. [interbase] journal des transactions
    Par maamar1979 dans le forum InterBase
    Réponses: 4
    Dernier message: 03/10/2006, 11h47
  4. [INTERBASE] Arrêt des transactions
    Par Vulcanos dans le forum InterBase
    Réponses: 7
    Dernier message: 03/03/2005, 17h49
  5. [interbase] gerer les transactions
    Par webbulls dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/05/2004, 18h27

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