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

Développement SQL Server Discussion :

Problème avec les transactions imbriquées


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut Problème avec les transactions imbriquées
    Bonjour,

    Dans un programme C#, j'ai tenté de faire des transactions imbriquées comme je le faisait en 1999 avec VBScript et le connecteur OLEDB pour SQL Server 7.0

    Seul hic, j'ai une erreur comme quoi c'est pas supporté par l'objet.

    Qu'à cela ne tienne, je tente de le faire "à la main" en SQL.

    Voici l'étendue des mes connaissances à propos des transactions, telles que je les ai apprises.
    Il me semble qu'avec SQL Server 7 ou 2000, ça marchait... A moins que je ne confonde avec Oracle (????) J'avoue que j'ai de plus en plus de doutes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    begin transaction A
      insert into matable (champ) values ('valeur a');
      begin transaction b
        insert into matable (champ) values ('valeur b');
      rollback transaction B -- on annule l'insertion de 'valeur b'
    commit transaction A -- on valide l'insertion de 'valeur a'
    => Bref, à la fin du script, on n'a que "valeur a" dans la base.

    Seul hic, SQL Server n'a pas l'air de l'entendre de cette oreille :

    Voici ce que j'ai tenté de faire, dans Entreprise Manager :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    begin transaction a
      insert into test (name) values ('test 1');
      begin transaction b
        insert into test (name) values ('test 2');
      rollback transaction b
    commit transaction a
    Ça plante sur le premier rollback. Pourquoi ?
    Impossible de restaurer b. Ni transaction ni point d'enregistrement de ce nom n'a été trouvé.
    J'ai donc tenté, selon les conseils de Bluedeep :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    begin transaction a
      insert into test (name) values ('test 1');
      begin transaction b
      save transaction c
        insert into test (name) values ('test 2');
      rollback transaction c
    commit transaction a
    Ça passe, mais la transaction est jugée "non terminée". Aussi, je ne vois pas ce que vient faire un savepoint au milieu...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    begin transaction a
      insert into test (name) values ('test 1');
      begin transaction b
      save transaction c
        insert into test (name) values ('test 2');
      rollback transaction c
    commit transaction a
    commit transaction a
    Ça passe, et cette fois la transaction est bien terminée.
    Sauf que je vois pas comment je pourrais générer programmatiquement ce double commit (et surtout, je vois pas à quoi il sert !)

    D'autaut que si j'en met un 3°, ça plante !

    Bref, quelqu'un peut me donner la syntaxe qui marche pour imbriquer des transactions dans SQL Server ?

    J'utilise la 2008 R2 Express

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    Voici ce que je cherche à faire :

    Transaction PARENT qui contient une transaction FILLE :

    FILLE : commitée
    PARENT : rollbackée
    => Rollback général

    FILLE : rollbackée
    PARENT : committée
    => Seule PARENT est sauvegardée

    FILLE : committée
    PARENT : committée
    => Tout est sauvegardé

    FILLE : rollbackée
    PARENT : rollbackée
    => Tout est annulé

    Le but du jeu, c'est d'arriver à trouver la syntaxe pour pouvoir :
    - avoir autant de FILLE que désiré dans PARENT
    - avoir autant de niveaux d'imbrications que désiré PARENT > FILLE > PETITE_FILLE > ARRIERE_PETITE_FILLE > etc.

    Afin de pouvoir faire des traitements complexes avec des transactions imbriquées, liées à des actions dans la GUI du programme.

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    Si c'est comme sybase ...

    Le rollback affecte toutes les transactions en cours,
    avec un nom de transaction le nom DOIT etre celui de la premiere transaction.

    Pour faire un retour partiel il faut faire des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    save tran savepoint_name
    a effectuer -je crois- avec rollback savepoint_name

    Apres j'ose imaginer que le code reprend à la suite de l'instruction rollback ,
    je ne l'ai jamais utilisé.

  4. #4
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    Effectivement, dans SQL Server il n'y a pas des vrais transaction imbriquées. L'annulation d'une transaction imbriquée annule toutes les autres transactions.

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    Ça, c'est l'implémentation que propose effectivement le connecteur .NET : passer par des savepoint.

    Le seul problème, c'est que ça ne gère que les scénari séquentiels, c'est beaucoup plus limité que les transactions imbriquées.

    Le truc qui m'étonne, c'est qu'avec la version 7 ou 2000, je ne me souviens plus, je suis quasi certain que je gérais sans problème des connexion imbriquées...

    Je deviens complètement fou ?

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    Si les save tran savepoint_name permettent de rollbacker jusqu'au savepoint_name , et que le code repart à la suite du rollback savepoint_name
    ...
    alors imbriqué ou sequentiel c'est pareil non ? avec un save point a la place du begin tran (fille )

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    Le seul truc que je pige quand même pas, c'est pourquoi SQL Server propose une variable @@tran_count ou un truc du genre, qui permet de connaître le niveau d'imbrication de transaction... puisqu'il ne supporte pas les transactions imbriquées

    Et encore plus drôle, pourquoi il ne supporte pas les transactions imbriquées alors qu'on peut parfaitement, au sein d'une transaction, appeler une procédure qui crée sa propre transaction, et ainsi de suite... et donc avoir de vraies transactions imbriquées

  8. #8
    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 : 43
    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
    Par défaut
    Et encore plus drôle, pourquoi il ne supporte pas les transactions imbriquées alors qu'on peut parfaitement, au sein d'une transaction, appeler une procédure qui crée sa propre transaction, et ainsi de suite... et donc avoir de vraies transactions imbriquées
    Non justement ce n'est pas ce que l'on appel des transactions imbriquées puisqu'un ROLLBACK annulera toutes les transactions ouvertes (principe d'Atomicité).

    D'ou l'utilité du @@trancount qui permet de savoir dans une procédure stockée le contexte d’exécution.

    Vous lancez des transactions à partir d'un code .NET?
    Quid d'un plantage de l'application? qui fera le rollback???

Discussions similaires

  1. Problème avec les transactions
    Par mina24 dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/03/2012, 11h01
  2. problème avec Les transactions
    Par mina24 dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 27/02/2012, 09h55
  3. SQL Server 2005: Problème avec les transaction logs
    Par n8ken dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2008, 16h42
  4. probléme avec les transaction
    Par amazircool dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/12/2007, 17h44
  5. problème avec les transactions
    Par Invité dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/07/2005, 12h43

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