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

Doctrine2 PHP Discussion :

Transaction et Doctrine


Sujet :

Doctrine2 PHP

  1. #1
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut Transaction et Doctrine
    Bonjour,
    Dans mon équipe, on est confronté a une difficulté dans des inserts massifs de données.
    Quand je dis massif, c'est sur 50 000 entrées, donc rien de bien impossible pour le système(il s'en sort plutôt pas mal pour le moment)

    La ou nous avons une difficulté, c'est lorsque l'on commence a douter de notre fichier en entrée et que l'on veut empêcher des insertions de données invalides.

    Par exemple, sur une contrainte simple comme unique... On a un fichier de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    1
    2
    3
    4
    5
    1
    6
    Ce qui nous donne en plan d'execution 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
     
    INSERT 1
    persist()
    INSERT 2
    persist()
    INSERT 3
    persist()
    INSERT 4
    persist()
    INSERT 5
    persist()
    INSERT 1
    persist()
    INSERT 6
    persist()
    flush()
    Bien sur, lors du flush, le système plante à la seconde insertion de 1.

    On a donc pensé faire ceci :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    SELECT 1
    IF 1 NOT in DB{
      INSERT 1
      persist()
    }
    SELECT 2
    IF 2 NOT in DB{
      INSERT 2
      persist()
    }
    SELECT 3
    IF 3 NOT in DB{
      INSERT 3
      persist()
    }
    SELECT 4
    IF 4 NOT in DB{
      INSERT 4
      persist()
    }
    SELECT 5
    IF 5 NOT in DB{
      INSERT 5
      persist()
    }
    SELECT 1 // doctrine ne trouve pas de valeur ici.
    IF 1 NOT in DB{
      INSERT 1
      persist()
    }
    SELECT 6
    IF 6 NOT in DB{
      INSERT 6
      persist()
    }
    flush()
    On se disait que comme dans une transaction SQL, doctrine allait regarder dans la queue d'objet à insérer quand on faisait le select... mais il semble que ca ne soit pas le cas.

    Est-ce que vous avez déjà eu ce problème, et comment l'avez-vous résolu ? Notre solution actuelle consiste à faire un flush à toutes les insertions, ce qui alourdit considérablement le traitement.
    Est-il possible d'utiliser un objet qui ferait correctement l'intermédiaire ?

    Merci,
    Pierre

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    On a eu le meme genre de soucis, doctrine2 a un gentil paragraphe perdu dans ses specs qui invite a ne pas l'utiliser en cas d'import massif de données

    utilisez vous de temps en temps des $em->clean() ?

  3. #3
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    dans la doc, ils expliquent comment faire l'import massif, même si ils le déconseillent(mais qu'appelle t'on massif, mon script met moins de 2 minutes a importer mes données)
    Nous n'avons pas de problème de mémoire, le script prend environ 3-4Mo de mémoire, donc pas de problème avec clean.

    C'est vraiment dans la logique du flush que l'on s'interroge... si l'on ne peut pas accéder aux données insérées dans la BDD avant le flush, je pense qu'il y a un manque de cohérence assez important.

Discussions similaires

  1. Transactions de Doctrine
    Par tiffany dans le forum ORM
    Réponses: 4
    Dernier message: 22/07/2010, 09h31
  2. gestion d'erreur et de transactions....
    Par Dge dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/02/2006, 22h20
  3. Apropos des Transactions au sein d'un Stored Procedure
    Par Sarbacane dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 16/11/2004, 08h21
  4. [PostgreSQL]transactions
    Par adri1 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 10/04/2003, 14h37
  5. Transaction avec DoCmd.runsql ???
    Par Gandalf24 dans le forum VBA Access
    Réponses: 29
    Dernier message: 11/02/2003, 20h35

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