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 :

Notion de thread dans SqlServer existe ?


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut Notion de thread dans SqlServer existe ?
    Bonjour,

    J'ai une simple question dont j'ai pas trouvé réponse sur Google. Peut être que je donne pas le bon mot clé.
    Dans une procédure stocké je souhaite lancer une autre procédure stocké mais que la procédure stocké hôte n'attende pas la fin de celle qui été executé.
    En gros. proc A appelle une proc B et pendant que B finit sont boulot A fait la suite.

    Je sais qu'il possible de le faire ainsi en passant par un job. Proc A lance le Job qui contient la Proc B. J'aurais souhaité une autre solution que celle-ci.
    Donc, est-ce que la notion de thread existe ?

    Merci

  2. #2
    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 317
    Points
    13 317
    Par défaut
    Bonjour

    Citation Envoyé par berceker united Voir le message
    Donc, est-ce que la notion de thread existe ?
    Non, ou, du moins, SQL Server n'expose pas de mécanisme programmatique permettant de travailler explicitement au niveau d'un thread (et c'est assez logique, car, qui dit thread dit présence de mécanismes de synchro - sémaphore, mutex, etc .... - sinon c'est inutilisable).

    Ceci dit il y a d'autres moyens de faire cela que le lancement d'un job (enfin, au moins un ).

    On va considérer que tu as un traitement principal et un traitement secondaire que tu veux paralléliser. (bien entendu, le principe est ensuite extensible).

    Par exemple, ton traitement secondaire est une PS.

    Tu va créer une SSBQ qui activera la PS quand un message arrive.

    Quand tu veux lancer ton traitement secondaire , ton traitement principal envoit un message sur la SSB Queue en question, ton traitement secondaire démarre, et ton traitement principal continue.

    Tu as en même temps un mécanisme de synchro (une deuxième SSBQ où la PS "secondaire" pourra poster son résultat et que ton traitement principal lit quand il en a besoin, en attendant dessus avec WAITFOR par exemple).

  3. #3
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut
    Merci pour cette information, je vais continuer mes recherches du coté de SSB !...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Quel est le but ? Parce ce que à part faire une usine à gaz transactionnelle de façon à casser les performances, je voit pas trop l'intérêt !

    A +

  5. #5
    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 317
    Points
    13 317
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Quel est le but ? Parce ce que à part faire une usine à gaz transactionnelle de façon à casser les performances, je voit pas trop l'intérêt !

    A +
    Il peut y avoir un tas de raisons; un cas typique : traitement préalable au lancement d'un ordonnancement Biztalk, alors qu'une autre partie du traitement peut être faite en avance de phase avant la fin de l'exécution de l'ordonnancement.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    J'espère que vous ne faites pas ça dans le SGDBDR !

    A +

  7. #7
    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 317
    Points
    13 317
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    J'espère que vous ne faites pas ça dans le SGDBDR !

    A +
    Vous pouvez préciser votre pensée ? je ne doute pas de votre connaissance parfaite de Sql Server (et, très sincérement, elle m'impressionne) mais j'ai l'impression que vous faites semblant d'ignorer par moment que cela ne constitue pas l'alpha et l'omega d'un système d'information.

    Donc, en résumé, je ne vois pas ce qu'il y a d'illogique à déclencher un ordonnancement biztalk sur un évenement interne au SGBD.

    J'ai même un cas très concret ici (j'entend par là, un cas sur lequel je suis à l'instant).

    - Réplication de fusion depuis des bases mobiles.

    - Un ordonnancement Biztalk doit effectuer un traitement dès la remontée d'info depus les bases mobiles. (contacter divers applications pour leur dispatcher des infos ).

    - Vous pouvez m'expliquer comment je peux le déclencher autrement que via l'envoi d'un message dans une SSBQ, envoi lui même déclenché via un trigger ? (la queue étant écoutée par BZT).

    (les problèmes que je rencontre vont d'ailleurs faire l'objet d'une série de questions, car la plateforme de réplication est plus qu'instable en mirroring, à tel point que le mirroring a été suspendu temporairerment).

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Quel est le but ? Parce ce que à part faire une usine à gaz transactionnelle de façon à casser les performances, je voit pas trop l'intérêt !

    A +
    En faite, il y a une application qui va lancer un processus qui peut être long je souhaite pas que l'application reste figé le temps du traitement. Nous ne pouvons pas modifier l'application aussi rapidement que modifier une proc. D'où l'idée de lancer un traitement en asynchrone dans le SQL dont le résultat final de ce processus nous intéresse pas.
    Pour l'instant c'est en étude mais même si pas utilisé au moins j'aurais appris quelque chose.

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Si vous souhaitez faire cela, il vous faut dans votre procédure stockée principale appeler la procédure stockée système msdb.dbo.sp_start_job, et dans ce job (dont vous ne planifiez pas l'exécution) appeler la procédure stockée secondaire ...

    @++

  10. #10
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Si vous souhaitez faire cela, il vous faut dans votre procédure stockée principale appeler la procédure stockée système msdb.dbo.sp_start_job, et dans ce job (dont vous ne planifiez pas l'exécution) appeler la procédure stockée secondaire ...

    @++
    Bonjour,
    En faite, c'était ma première idée. Mais je souhaite l'éviter "pour l'instant". Mais merci de confirmer que ma première idée est viable

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Pour tout un tas de raison dont la plus importante est que les SGBDR ont tous un OS interne avec un pas d'horloge qui n'a rien à voir avec celui d'un OS, les interruptions ne doivent en aucun cas être faite à la légère. Et s'amuser à piloter les threads de le sorte peut s'avérer catastrophique.

    Le mieux est toujours de se reposer sur l'ordonnanceur propre au SGBDR que vous avez, ici SQL Server, quitte à faire une boucle d'écoute infinie dans une procédure stockée. C'est d'ailleurs comme cela que l'on fait pour écouter des messages Service Broker...

    Exemple :

    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
    CREATE PROC sp_mytableServiceProgram
    AS
    SET NOCOUNT ON;
     
    DECLARE
        @XML XML,
        @MessageBody VARBINARY(MAX),
        @MessageTypeName nvarchar(256),
        @Dialog UNIQUEIDENTIFIER;
     
    -- This procedure continues to process messages in the queue until the
    -- queue is empty.
     
    WHILE (1 = 1)
    BEGIN
        BEGIN TRANSACTION;
        --BEGIN DISTRIBUTED TRANSACTION; --Tried this but didn't help.
     
        -- Receive the next available message
        WAITFOR (
            RECEIVE TOP(1) -- just handle one message at a time
                @MessageTypeName = message_type_name,
                @MessageBody = message_body,
                @Dialog = conversation_handle
                FROM mytableQueue
        ), TIMEOUT 2000 ;
     
        -- If RECEIVE did not return a message, roll back the transaction
        -- and break out of the while loop, exiting the procedure.
        IF (@@ROWCOUNT = 0)
        BEGIN
            ROLLBACK TRANSACTION;
            BREAK;
        END ;
     
        SET @XML = CAST(@MessageBody AS XML);
     ...
    A +

  12. #12
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 500
    Points : 6 084
    Points
    6 084
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Pour tout un tas de raison dont la plus importante est que les SGBDR ont tous un OS interne avec un pas d'horloge qui n'a rien à voir avec celui d'un OS, les interruptions ne doivent en aucun cas être faite à la légère. Et s'amuser à piloter les threads de le sorte peut s'avérer catastrophique.

    Le mieux est toujours de se reposer sur l'ordonnanceur propre au SGBDR que vous avez, ici SQL Server, quitte à faire une boucle d'écoute infinie dans une procédure stockée. C'est d'ailleurs comme cela que l'on fait pour écouter des messages Service Broker...

    Exemple :

    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
    CREATE PROC sp_mytableServiceProgram
    AS
    SET NOCOUNT ON;
     
    DECLARE
        @XML XML,
        @MessageBody VARBINARY(MAX),
        @MessageTypeName nvarchar(256),
        @Dialog UNIQUEIDENTIFIER;
     
    -- This procedure continues to process messages in the queue until the
    -- queue is empty.
     
    WHILE (1 = 1)
    BEGIN
        BEGIN TRANSACTION;
        --BEGIN DISTRIBUTED TRANSACTION; --Tried this but didn't help.
     
        -- Receive the next available message
        WAITFOR (
            RECEIVE TOP(1) -- just handle one message at a time
                @MessageTypeName = message_type_name,
                @MessageBody = message_body,
                @Dialog = conversation_handle
                FROM mytableQueue
        ), TIMEOUT 2000 ;
     
        -- If RECEIVE did not return a message, roll back the transaction
        -- and break out of the while loop, exiting the procedure.
        IF (@@ROWCOUNT = 0)
        BEGIN
            ROLLBACK TRANSACTION;
            BREAK;
        END ;
     
        SET @XML = CAST(@MessageBody AS XML);
     ...
    A +
    Ha oauis, pas mal comme idée.
    Merci

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

Discussions similaires

  1. Probleme d'enregistre de caracteres unicodes dans sqlserver
    Par ouedmouss dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/09/2005, 09h13
  2. création de plusieurs threads dans WinMain
    Par ChidoriRasengan dans le forum DirectX
    Réponses: 1
    Dernier message: 15/06/2005, 22h36
  3. developper par PLSQL dans SQLServer
    Par abdou.sahraoui dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 14h19
  4. Notion de boucles dans Business Object
    Par lionelEIGIP dans le forum Deski
    Réponses: 1
    Dernier message: 08/04/2004, 12h26
  5. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 19h16

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