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 :

pb ADO et transactions besoin de spécialistes


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut pb ADO et transactions besoin de spécialistes
    Bonjour,
    voici le cas de figure:
    J'ai plusieurs threads qui tournent en parallèle et qui se connectent (via ADDO) à une bdd SQL server (en fait bdd EMS) pour faire des insertions dans des tables.

    Y a t-il une astuce pour configurer au mieux ma connexion ? J'essaie de jouer sur les propriétés IsolationLevel et Mode du TAdoConnexion mais pas moyen que ça fonctionne. Dès que mon deuxième thread démarre j'obtiens le message d'erreur : "Impossible de démarrer d'autres transactions pour cette session"

    Merci

    Isa
    Isachat

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tes threads ont ils chacun leur ADOConnection ?

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par philnext
    Tes threads ont ils chacun leur ADOConnection ?
    Effectivement, il ne doit y avoir qu'un seul ADOConnection pour touts tes threads.

    Par ailleurs, je te conseille de placer les curseurs côté serveur (CursorLocation := clUseServer), de mettre également le niveau d'isolation (IsolationLevel) à ilReadCommitted. Quant au mode tu le laisses à cmUnknown.

    Il faut aussi que tes transactions soient les plus courtes possibles.

    Est-ce que tes thread auront des accès concurrentiels à un même enregistrement ?
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

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

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Il y a un seul TAdoConnection pour tous les threads :

    ConnectOptions = coConnectUnspecified
    CursorLocation = clUseServer
    IsolationLEvel = ilReadCommitted
    KeepConnection = true
    Mode = cmUnknown
    Provider = SQLOLEDB.1

    Les transactions sont très courtes: Je lis la ligne de données envoyée par le thread et j'insère dans la base sachant que plusieurs threads peuvent tourner en même temps pour faire la même chose mais avec des données différentes.

    Quand un seul thread tourne, aucun problème. Dès que j'en démarre un autre j'ai le message d'erreur EOleException "Impossible de démarrer d'autres transactions pour cette session"

    Merci de votre aide

    Isa
    Isachat

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Pascal Jankowski
    Effectivement, il ne doit y avoir qu'un seul ADOConnection pour touts tes threads.
    Justement non quand on utilise des threads et des AdoConnection.BeingTrans/CommitTrans/RollBackTrans, il ne peut y avoir seulement qu'une demande de début de transaction (BeginTrans) du AdoConnection vers la base de données.

    Donc il faut 1 AdoConnection par thread, mais le problème c'est que chaque AdoConnection va prendre la place d'un utilisateur (session).

    Le seul moyen, dans un cas comme celui la, c'est l'utilisation de procédures stockées qui font les appels de transactions en interne dans SQL Serveur.

    La il n'y a plus de soucis avec le multi-threads. ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Bonjour (re- )
    Je viens de rajouter un test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat
      sleep(xxx);
    until (not ADOConnection1.InTransaction);
    juste avant mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOConnection1.BeginTrans
    et cela semble fonctionner, plus de message d'erreurs et les données envoyées par chaque thread sont bien enregistrées dans la base...

    Vaut-il mieux passer par des procédures stockées ? Dans ce cas j'ignore totalement comment on fait...

    Merci de votre aide en tout cas

    Isa
    Isachat

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par isachat666
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat
      sleep(xxx);
    until (not ADOConnection1.InTransaction);
    juste avant mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOConnection1.BeginTrans
    et cela semble fonctionner, plus de message d'erreurs et les données envoyées par chaque thread sont bien enregistrées dans la base...
    arglllll *s'étrangle* , un sleep dans une boucle
    Le sleep est une procédure blocante, tant que le sleep est pas finit l'application est en pause, donc c'est à éviter fortement.


    Citation Envoyé par isachat666
    Vaut-il mieux passer par des procédures stockées ? Dans ce cas j'ignore totalement comment on fait...
    Si j'oublie pas, je t'ammene un exemple cet après midi, faut que je pense à prendre ma bible sur SQL Serveur au boulot ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Malatar
    arglllll *s'étrangle* , un sleep dans une boucle
    hi hi, non non ne t'étrangles pas !!!
    heu désolée
    mais bon j'ai fait ça vite, l'idée étant que le thread se mette en "pause" tant que la transaction précédente est encore en cours avant de commencer une autre transaction... c'est pas bien, doc ?

    Sinon dois-je continuer à utiliser le même TAdoConnection pour tous les threads (en attendant de savoir utiliser les procédures stockées) ou bien créer un TAdoConnection par thread ????

    encore merci

    Isa
    Isachat

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le mieux reste quand même les procédures stockées et un seul AdoConnection.

    Car comme je l'ai dit plus haut, si tu as 3 Threads en même temps, ca equivaut à 3 connexion à SQL serveur et je penses que tu sais qu'il y a des licenses utilisateurs pour SQL serveur qui limite les accès à partir d'un certain nombre de connecter.
    (La version Express est limitée à max 5 personnes en même temps)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Merci pour tes précieux conseils Malatar.

    Je vais essayer de voir comment je peux m'en sortir avec les procédures stockées. Je devrais bien pouvoir trouver ça quelque part sur le net.

    Isa
    Isachat

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par isachat666
    Merci pour tes précieux conseils Malatar.

    Je vais essayer de voir comment je peux m'en sortir avec les procédures stockées. Je devrais bien pouvoir trouver ça quelque part sur le net.

    Isa
    Je pense que tu n'auras pas à chercher bien loin, vu qu'il y a une section SQL serveur sur developpez.com ^^

    PS : Mouarf, j'ai oublié de prendre ma doc, et de tête comme çà, je me souviens plus de la synthaxe exacte
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    J'ai réussi à créer ma procédure stockée, jusque là pas de problème.
    Mais c'est après que ça se complique car il y a des paramètres et je ne trouve pas la bonne syntaxe côté delphi pour les initialiser...
    mais je continue de chercher...

    Isa
    Isachat

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    J'ai réussi à créer ma procédure stockée, j'ai un peu galéré pour renseigner les paramètres mais... pour l'instant CA MARCHE !!!!! (dans mon test en tout cas) Je laisse tourner un peu pour voir... ensuite c'est à tester en situation réelle... sinon merci !
    et je peux mettre résolu (pour le moment du moins)

    Isa
    Isachat

  14. #14
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 202
    Points : 108
    Points
    108
    Par défaut Threads
    salut a tous,

    c'est quoi un Thread?

  15. #15
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par franck SEFIC
    salut a tous,

    c'est quoi un Thread?
    Face à ce genre de question, un seul réflexe: la FAQ.

    @+

  16. #16
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 202
    Points : 108
    Points
    108
    Par défaut
    thank you my friend

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

Discussions similaires

  1. besoin d'explication sur ADO
    Par bambi98 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/03/2007, 15h25
  2. [ADO.Net][C#]Comment coder une transaction de SqlDA.Update?
    Par subzero82 dans le forum Accès aux données
    Réponses: 5
    Dernier message: 12/02/2007, 14h23
  3. [ADO.Net][VB.Net]Comment implementer une Transaction?
    Par mictif dans le forum Accès aux données
    Réponses: 2
    Dernier message: 24/03/2006, 15h41
  4. Transaction, ADO et multi-utilisateurs
    Par SkYsO dans le forum Bases de données
    Réponses: 5
    Dernier message: 27/01/2006, 10h56
  5. [C#] [ADO.NET] Besoin de conseil
    Par djsbens dans le forum Accès aux données
    Réponses: 8
    Dernier message: 01/04/2005, 15h04

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