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 :

2 questions sur les transactions


Sujet :

Développement SQL Server

  1. #1
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut 2 questions sur les transactions
    Bonjour,

    2 petites questions à propos des transactions.

    Le contexte :
    Je m'occupe d'un module de transferts de données entre 2 systèmes dont l'un utilisant une BDD SQLServer 2008R2 et l'autre est représenté par des fichiers EDIFACT.
    Ce module est découpé en 9 services (un pour chaque flux), chaque flux dispose de sa connexion au SGBD.
    Donc soit un service intègre un flux EDIFACT dans une BDD SQL Server, soit il génère un flux EDIFACT à partir de la BDD.

    Dans le cas des réceptions, j'ai énormément de requêtes pour intégrer (gestion de stock notamment) tous les éléments du flux EDI en BDD et j'intègre la totalité de ces requêtes dans une seule et unique transaction.

    Pour donner un ordre d'idée ça peut aller jusqu'à 50 requêtes de tous types (SELECT, UPDATE, INSERT et DELETE) entre le BEGIN et le COMMIT.

    Au niveau du code, nous utilisons Windev (pas le choix :'( ). Mon code appelant au niveau le plus haut est encadré par un équivalent de Try Catch. Le BEGIN est appelé au début du Try, le COMMIT juste en dehors et le ROLLBACK est dans le Catch.
    Dans les méthodes de niveau inférieur, toute erreur lève ou est propagée en une exception. On finit donc systématiquement par un Rollback en cas d'erreur.

    Le code SQL d'initialisation d'une transaction est le suivant :
    Le code SQL de fin de transaction est le suivant :
    Le code SQL de rollback est le suivant :
    Les transactions ne sont donc pas nommées, mais comme chaque service a sa propre connexion cela ne devrait pas poser de problème. Si ?

    A l'arrivée, je constate que ça ne fonctionne pas. Lors que j'ai une erreur, les requêtes de modification de la BDD précédant l'erreur sont toujours actives après l'exécution du service.

    Quelqu'un aurait-il une piste pour localiser le dysfonctionnement ?

    Serait-ce du à l'absence de nommage des transactions ?
    Au nombre de requêtes dans les transactions ?
    A autre chose que je ne connais pas ?

    Voilà. Sinon dernière info le niveau d'isolation n'est pas modifié, il est en READ COMMITTED.

    Merci.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Le BEGIN est appelé au début du Try, le COMMIT juste en dehors et le ROLLBACK est dans le Catch.
    LE COMMIT doit être dans le Try, à la fin juste avant le Catch, car lui aussi peut générer une exception qui doit être traitée par le ROLLBACK


    Lors que j'ai une erreur, les requêtes de modification de la BDD précédant l'erreur sont toujours actives après l'exécution du service.
    Certainement parce qu'un de tes codes sort mal, n'exécutant ni le COMMIT, ni le ROLLBACK. Une transaction étant toujours en cours les requêtes suivantes sont bloquées.

    Après avoir fait les modifs et avant de relancer ton service/executable, pense à aller faire un tour dans SQLServer pour supprimer toutes les transactions et verrous encore en attente.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Merci pour l'aide.

    Je les vois où les informations sur les transactions dans SQL Server Manadgement Studio ?
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Tu peux utiliser la requete suivante pour avoir la liste des transactions actives sur ta base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM sys.dm_tran_session_transactions
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Bonjour,

    2 petites questions à propos des transactions.
    1) redéveloppez le tout sous forme de proc stock

    2) alimentez les fichiers dans une base "tampon" dans laquelle vous avez reproduit des tables brutes équivalente à vos tables de destination, ou mieux des tables in (proche de la structure de vos fichier) et des tables out (proche de la structure de vos tables de destinations

    3) faites tout votre nettoyage de données par des requêtes dans ces tables tampon de IN vers OUT

    4) un fois nettoyé désactivez tous les index, sauf ceux sémantiques (clef primaire, contrainte d'unicité...) de toutes les tables concernées avant la mise à jour (ALTER INDEX ... DISABLE), insérez les données de table tampon out à table cible dans la base de prod et remettez les après (ALTER INDEX ... REBUILD).

    5) au besoin, ne gérez aucune transaction globale, mais prévoyez de loguer les erreurs des commandes finale pour savoir ou vous en êtes...

    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/ * * * * *

  6. #6
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par SQLpro Voir le message

    Si je vous suis bien, il me faut une BDD contenant un miroir des fichiers textes EDI, une autre BDD contenant un miroir de la BDD de prod et ensuite gérer les imports en BDD de prod via des procédures stockées et le tout sans transactions ?
    Une seule base tampon suffit
    Le fait d'effectuer toutes les manipulations depuis le SGBD minimisant l'utilité des transactions ?
    OUI

    Donc en fait tout le code de contrôle des données se ferait en procédures stockées ?
    Oui, c'est ce qui va la plus vite, faire de l'ELT et pas de l'ETL


    Je ne comprends pas l'intérêt de désactiver les index surtout que comme je le disais au début de ce post il s'agit d'import quotidien au fil de l'eau, c'est à dire pendant que toute une série d'opérateurs (une vingtaine directement connectés à la BDD et une centaine en mode déconnecté) travaille.
    A voir, mais cela permet d'aller très notablement plus vite ! a lire : http://sqlpro.developpez.com/cours/s...ivation-index/[quote]

    Citation Envoyé par SQLpro Voir le message
    5) au besoin, ne gérez aucune transaction globale, mais prévoyez de loguer les erreurs des commandes finale pour savoir ou vous en êtes...

    A +
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    j'ai écrasé votre message en me trompant de bouton !!!!!

    Désolé !
    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/ * * * * *

  8. #8
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Pas grave.

    Pour le reste je ne peux malheureusement pas refaire cette partie pour des raisons de délais mais je prends note de la méthodologie pour un prochain projet.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

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

Discussions similaires

  1. Petite question sur les transactions
    Par Invité dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/06/2012, 12h09
  2. question de base sur les transactions
    Par nouraty dans le forum Débuter
    Réponses: 3
    Dernier message: 22/12/2010, 21h51
  3. Question sur les performance d'une transaction SQL
    Par SlashEne dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 24/04/2008, 22h41
  4. question sur les transactions
    Par vbcasimir dans le forum Débuter
    Réponses: 3
    Dernier message: 07/06/2005, 10h15
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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