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

MS SQL Server Discussion :

[SQL][Transaction]Transactions imbriquées, scripts de test and rock and roll


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut [SQL][Transaction]Transactions imbriquées, scripts de test and rock and roll
    Je suis un peu confus sur ce qui se passe dans ce code:
    Code SQL : 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
     
    DECLARE @RC int
    DECLARE @code_article varchar(20)
    DECLARE @designation varchar(50)
    DECLARE @id bigint
    DECLARE @message varchar(80)
     
    -- Définir les valeurs de paramètre
    set @code_article = 'codearticle 1 test creer article'
    set @designation = 'designation 1 test creer article'
     
    print 'waat '+convert (varchar, @@trancount)
    BEGIN TRANSACTION
    print 'weet '+convert (varchar, @@trancount)
    select TOP 1 @code_article=code_article from article
    print 'wiit '+convert (varchar, @@trancount)
    EXEC @RC = [Sprout].[dbo].[creer_article] @code_article, @designation, @id OUTPUT , @message OUTPUT 
    print 'woot '+convert (varchar, @@trancount)
    ROLLBACK TRANSACTION
    print 'wuut '+convert (varchar, @@trancount)
    J'obtiens ces messages:
    Citation Envoyé par Analyseur de Requêtes
    waat 0
    weet 1
    wiit 1
    Serveur : Msg 266, Niveau 16, État 2, Procédure creer_article, Ligne 24
    Le compte des transactions après EXECUTE indique qu'il manque une instruction COMMIT ou ROLLBACK TRANSACTION. Compte précédent = 1, compte en cours = 0.
    woot 0
    Serveur : Msg 3903, Niveau 16, État 1, Ligne 18
    La requête ROLLBACK TRANSACTION n'a pas de BEGIN TRANSACTION correspondante.
    wuut 0
    La procédure stockée ouvre une transaction pour vérifier que le code_article n'existe pas encore. Dans mon cas, j'ai fait exprès de sélectionner un code_article qui existe, voir comment elle se comporte. Dans ces cas-là, je fais un rollback. J'ai regardé à l'intérieur, mais il n'y a pas de rollback en trop.
    Alors, y-a-t'il quelque chose que je n'ai pas vu?
    Un truc que je n'ai pas compris à propos des transactions immbriquées?
    Est-ce que Joanna choisira Christophe ou Marc?


    Contexte:
    Je suis en train d'écrire un script de test pour cette procédure stockée, et pour pouvoir tranquilement tabasser la base de données sans effets secondaires, je voulais encadrer le tout dans un espèce de grande transaction que je 'rollbacke' à la fin. Hop, ni vu ni connu, j'ai fait mes tests et personne a rien vu.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    La notion de transaction imbriquée n'existe pas. En effet, du fait du COMMIT, il ne peut pas exister de transactions dans lesquelles la transaction interner fait un COMMIT et l'externe un ROLLBACK.

    Le modèle de pilotage de la transaction lorsque l'on imbrique des commandes BEGIN TRAN et COMMI/ROLLBACK est symétrique ou asymétrique.

    Modèle symétrique :
    Le premier BEGIN TRANSACTION démarre la transaction. Tous les suivants sont ignorés. La dernière commande ROLLBACK ou COMMIT correspondant au premier BEGIN TRANSACTION est la seule qui termine la transaction.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN TRAN
    
       BEGIN TRAN
    
          BEGIN TRAN
    
          COMMIT
    
       ROLLBACK
    
    COMMIT
    En bleu les ignorées, en rouge les effectuées. La transaction est validée...

    Dans le modèle asymétrique, le premier ROLLBACK annule la transaction, mais c'est toujours le dernier COMMIT qui la valide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN TRAN
    
       BEGIN TRAN
    
          BEGIN TRAN
    
          COMMIT
    
       ROLLBACK
    
    COMMIT
    En bleu les ignorées, en rouge les effectuées. La transaction est annulée...

    SQL Server utilise le comportement asymétrique qui est plus proche de la réalité qui veut que si un seul élément intermédiaire est mauvais alors toute la transaction est mauvaise dont annulée, alors que si tous les éléments sont bon, alors la transaction est bonne donc validée.
    Pour réaliser cela SQL Server utilise un compteur d'empilement de transaction @@TRANCOUNT.

    J'ai écrit un article non encore publié sur le sujet. Si cela vous intéresse, laissez moi votre mail en mail privé et je vous l'enverrais.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut
    Merci pour votre réponse. Cela répond à ma question.
    Du coup, j'ai plein d'avertissements quand j'execute mon script de test. Est-ce qu'il y a un moyen de les désactiver? Non, attends, c'est peut-être pas une bonne idée.
    Et si je faisais, à la fin de chaque test :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while @@trancount > 0 begin
        rollback
    end
    Et comment vous faites pour executer des scripts de test puis annuler tout ce que ces scripts viennent de faire ?

    Et en fait, ce qui m'a un peu choqué dans mon message d'erreur, c'est le raisonnement:

    compte précédent = 1
    compte en cours = 0

    donc, il manque un commit ou un rollback

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

Discussions similaires

  1. Tutoriel sur les tests, bugs & rock'n'roll
    Par Francis Walter dans le forum Architecture
    Réponses: 2
    Dernier message: 26/10/2014, 02h28
  2. Réponses: 0
    Dernier message: 11/02/2008, 11h37
  3. SELECT * FROM xx WHERE yy AND zz AND tt AND
    Par french-petzouille dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/03/2007, 09h52
  4. [sql] [as400] [transaction]
    Par eizo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/03/2006, 18h36
  5. Scripts de test de SGBD (SQL-Server et Oracle)
    Par chti_juanito dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 24/10/2005, 16h05

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