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

ADO.NET Discussion :

Transaction Rollback simplifiée


Sujet :

ADO.NET

  1. #1
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Points : 164
    Points
    164
    Par défaut Transaction Rollback simplifiée
    Bonjour,

    je m'interroge sur un problème de rollback.
    Poursuivant un code selon certains critères, je dois réaliser un rollback en c++ avec ado.net mais pour l'instant, la seule solution que j'ai trouvé pour faire un rollback est que lorsque je crée la connexion, je commence avec un "begin transaction" comme méthode.

    la difficulté est que:
    • un j'ai des dizaines d'insert
    • deux, il faudrait que je retouche un code que je ne peux tellement remodifier le code.


    J'avais tenter de remodifier le code pour faire en sorte que cela marche mais cela ne marchait pas.
    je m'étais basé sur
    msdn

    je voudrais savoir si il y a une méthode plus simple de rollback (en tenant compte que si une database est créée, elle doit disparaitre avec le rollback)

    merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 60
    Points : 100
    Points
    100
    Par défaut
    Bonsoir c'est très flou peux tu montrer le code ?

  3. #3
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Points : 164
    Points
    164
    Par défaut
    Il y a prés de 2000 lignes de code.

    au démarrage, ne connaissant pas rollback, ado.net et visual c++ et travaillant sur un serveur différent de celui à qui est destiné le code, j'avais fait une connexion à chaque lecture d'un fichier car on me l'avait conseillé.

    J'avais d'abord essayé de mettre en place en commande BEGIN TRANSACTION , COMMIT TRANSACTION et un ROLLBACK TRANSACTION.

    mais sans succés et j'ai essayé de faire un commit avec ado.net mais j'avais le message:
    This SqlTransaction has completed; it is no longer usable.
    lors que j'ai ouvert la transaction une fois et fait un commit à la fin.

    là, j'essaie de pouvoir faire un rollback qui je veux annuler une action pendant ou après les insertions mais de manière simple.
    Peut-être devrais-je créer une base de données et des tables temporaires de l'existant mais j'ignore comment le faire.
    C'est-à dire copier une base de données et des tables existantes et si j'annule, je prends ces copies et je les remets comme db et tables par défault.

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par locus Voir le message
    j'avais fait une connexion à chaque lecture d'un fichier car on me l'avait conseillé
    Enlève-moi d'un doute...

    Qu'est-ce que tu entends par "chaque lecture" ?
    S'il s'agit de la lecture d'une ligne dans le fichier, je n'ai qu'une question à te poser : "Qu'est les le sinistre crétin qui t'as dit ça ?".

    Un rappel sur les transactions SQL :

    Lorsque tu travailles sans transaction, chaque requête est exécutée immédiatement sur les données, et la modification des données est immédiate : toi, mais aussi toutes les autres connexions ont alors accès à la modification.

    Ceci à deux gros inconvénients :
    - En cas de plantage non récupérable au milieu d'un traitement, les données ne sont qu'à moitié mises à jour : il devient alors compliqué de reprendre là où on a planté, ou d'annuler le début des modifications
    - Les autres connexions voient les données pendant qu'elles sont en train de se mettre à jour. Ainsi, en compta par exemple, on peut voir les tables DEBIT et CREDIT non équilibrées à un instant T

    Bref, la merde.

    Donc on a inventé les transactions :
    Dans une transaction :
    - Y'a que toi qui voit ce que tu fais, jusqu'au moment où tu fait "commit" et là, immédiatement toutes tes modifications sont accessibles à tout le monde
    - Si tu fait une connerie, tu peux faire "rollback", et l'ensemble des traitements que tu as fait dans ta transaction sont immédiatement annulés
    - Si une personne tente de lire/modifier les données que tu es en train de modifier, elle va être mise en attente jusqu'à ce que tu te sois décidé entre COMMIT ou ROLLBACK

    Aussi, les transactions sont imbriquables, mais là t'en a pas besoin.

    Bref, dans ton cas, j'imagine que tu veux insérer l'ensemble du fichier, sinon rien.

    Donc voici l'algo à suivre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Ouvre une connexion à la base de donnée en tout début du traitement.
    Pour chaque fichier
      Création d'une transaction 1
      Pour chaque ligne du fichier
         Insertion de la ligne du fichier
         Si erreur
           Rollback de la transaction 1
           Sortie de pour chaque fichier
         Fin si erreur
      Fin pour chaque ligne du fichier
      Commit de la transaction 1
    Fin pour chaque fichier
    Fermeture de la connexion à la base de donnée

    Si tous les fichiers doivent être intégrés ou aucun, alors :

    En première ligne, il faut créer une transaction 2.
    En avant dernière ligne, il faut commiter la transaction 2
    En cas d'erreur, ne pas sortir de la boucle, mais faire un rollback de la transaction 2, fermer la connexion puis sortir de la fonction.

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Si tu utilises SQL serveur 2008, utilises les Row Values Parameters !
    Des lors tu pilotera ta transaction via ta procedure stockee.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par locus Voir le message
    il faudrait que je retouche un code que je ne peux tellement remodifier le code.
    En clair , ça veut dire quoi ?

    je voudrais savoir si il y a une méthode plus simple de rollback


    J'ai un peu de mal à comprendre ce qui peut être plus simple que d'appeler RollBack.

    Je pense qu'il est nécessaire de reformuler ton problème car ta demande n'est pas exactement limpide.

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Si tu utilises SQL serveur 2008, utilises les Row Values Parameters !
    Tu veux dire les Table Valued Parameters?

    http://msdn.microsoft.com/en-us/library/bb510489.aspx

    De toute facon, l'intégration d'un fichier en base ne devrait pas se faire avec du code client mais bon je vais encore me faire taper dessus ici

  8. #8
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Exactement !

  9. #9
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Points : 164
    Points
    164
    Par défaut
    Merci pour vos réponses.

    Je sais que le rollback est simple à utiliser mais le code est quasi-figé (et ma marge de manœuvre est limité)

Discussions similaires

  1. [Data] Problème transaction rollback requête alter table
    Par fadjerx dans le forum Spring
    Réponses: 2
    Dernier message: 25/02/2010, 16h32
  2. insertion trop longues => transaction rollback !
    Par RealDarren dans le forum Accès aux données
    Réponses: 5
    Dernier message: 04/02/2009, 10h37
  3. [debutant]transaction rollback ?!
    Par christopheEU dans le forum Développement
    Réponses: 2
    Dernier message: 19/09/2008, 13h40
  4. [T-SQL] Imbrication de TRANSACTION & RollBack
    Par arnolem dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/04/2008, 16h36
  5. Annuler une transaction (rollback) après un commit ?
    Par Boulotaur2024 dans le forum Débuter
    Réponses: 1
    Dernier message: 18/04/2006, 20h31

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