OVH Cloud OVH Cloud

Gestion des transaction

3 réponses
Avatar
Stéphane ANDRE
Bonjour,
Je me pose des questions concernant la gestion des
transaction avec ADO .Net et une base SQL Server. Que
conseillez-vous pour effectuer des transactions imbriqu=E9s
avec ADO .Net?
Je m'explique, j'ai du code qui fait un ensemble
d'op=E9rations de mise =E0 jour de stock sur une s=E9ries
d'article et qui est donc compos=E9 d'une boucle appellant
une m=E9thode de mise =E0 jour du stock. Dans cette m=E9thode je
souhaiterai d=E9marrer une transaction et la cloturer en fin
de m=E9thode si tout s'est bien pass=E9. Dans le code appellant
je souhaiterai d=E9marrer une transaction globale et la
valider si tous mes appels =E0 ma m=E9thode se sont bien pass=E9.
Les difficult=E9s que je rencontre sont du au fait que
lorsque l'on fait un .Fill() la connexion est
automatiquement ferm=E9e et du coup les transactions
inutilisables. Actuellement j'utilise les donc, plutot que
l'objet connection d'ADO .Net, les transactions nomm=E9es de
SQL Server via des "BEGIN TRANSACTION MATRANSACTION"
ex=E9cut=E9e via l'objet DataCommand d'ADO. Mais je me pose
tout de m=EAme une question : est-ce que cela est correct si
ma connexion est ferm=E9e par un .Fill alors qu'aucun COMMIT
ou ROLLBACK n'est effectu=E9. Que me conseillez-vous et ou
puis-je trouver une doc vraiment explicite sur la gestion
des transactions imbriqu=E9es avec ADO .NET ?

Merci d'avance.

3 réponses

Avatar
Laurent GEFFROY
Pourquoi ne passerais-tu pas ton objet de transaction en paramètre de ta
méthode.
Utilise éventuellement les throw pour renvoyer les erreurs à la methode
appelante.



"Stéphane ANDRE" a écrit :

Bonjour,
Je me pose des questions concernant la gestion des
transaction avec ADO .Net et une base SQL Server. Que
conseillez-vous pour effectuer des transactions imbriqués
avec ADO .Net?
Je m'explique, j'ai du code qui fait un ensemble
d'opérations de mise à jour de stock sur une séries
d'article et qui est donc composé d'une boucle appellant
une méthode de mise à jour du stock. Dans cette méthode je
souhaiterai démarrer une transaction et la cloturer en fin
de méthode si tout s'est bien passé. Dans le code appellant
je souhaiterai démarrer une transaction globale et la
valider si tous mes appels à ma méthode se sont bien passé.
Les difficultés que je rencontre sont du au fait que
lorsque l'on fait un .Fill() la connexion est
automatiquement fermée et du coup les transactions
inutilisables. Actuellement j'utilise les donc, plutot que
l'objet connection d'ADO .Net, les transactions nommées de
SQL Server via des "BEGIN TRANSACTION MATRANSACTION"
exécutée via l'objet DataCommand d'ADO. Mais je me pose
tout de même une question : est-ce que cela est correct si
ma connexion est fermée par un .Fill alors qu'aucun COMMIT
ou ROLLBACK n'est effectué. Que me conseillez-vous et ou
puis-je trouver une doc vraiment explicite sur la gestion
des transactions imbriquées avec ADO .NET ?

Merci d'avance.




Avatar
Stéphane ANDRE
J'ai essayé, cela ne solutionne pas mon problème car même
si je passe mon objet transaction la connexion se fermant
suite au fill dans ma méthode j'ai le même pb.

-----Message d'origine-----
Pourquoi ne passerais-tu pas ton objet de transaction en


paramètre de ta
méthode.
Utilise éventuellement les throw pour renvoyer les


erreurs à la methode
appelante.



"Stéphane ANDRE" a écrit :

Bonjour,
Je me pose des questions concernant la gestion des
transaction avec ADO .Net et une base SQL Server. Que
conseillez-vous pour effectuer des transactions




imbriqués
avec ADO .Net?
Je m'explique, j'ai du code qui fait un ensemble
d'opérations de mise à jour de stock sur une séries
d'article et qui est donc composé d'une boucle




appellant
une méthode de mise à jour du stock. Dans cette




méthode je
souhaiterai démarrer une transaction et la cloturer




en fin
de méthode si tout s'est bien passé. Dans le code




appellant
je souhaiterai démarrer une transaction globale et la
valider si tous mes appels à ma méthode se sont bien




passé.
Les difficultés que je rencontre sont du au fait que
lorsque l'on fait un .Fill() la connexion est
automatiquement fermée et du coup les transactions
inutilisables. Actuellement j'utilise les donc, plutot




que
l'objet connection d'ADO .Net, les transactions




nommées de
SQL Server via des "BEGIN TRANSACTION MATRANSACTION"
exécutée via l'objet DataCommand d'ADO. Mais je me




pose
tout de même une question : est-ce que cela est




correct si
ma connexion est fermée par un .Fill alors qu'aucun




COMMIT
ou ROLLBACK n'est effectué. Que me conseillez-vous et




ou
puis-je trouver une doc vraiment explicite sur la




gestion
des transactions imbriquées avec ADO .NET ?

Merci d'avance.




.



Avatar
Simon Mourier
C'est un vaste sujet :-)

Vous pouvez utiliser les transactions automatiques dont la prise en charge
est assurée depuis bien longtemps par Windows (par l'intermédiaire du
service MSDTC). C'est possible car SQL Server le supporte aussi. Le choix
d'implémentation final dépend ensuite de la plateforme exacte.

Si vous êtes sous Windows 2000 ou Windows XP, vous pouvez utiliser les
classes .NET ServicedComponent. Dans ce cas, vos objets pourront utiliser
des transactions automatiques proposées par COM + 1.0

Quelques exemples ici:
http://progtutorials.tripod.com/DotNetTransaction.htm
http://www.codersource.net/csharp_distributed_transactions.aspx

Si vous êtes sous Windows Server 2003 ou Windows XP SP2 (le SP2 est
important), je vous conseille d'utiliser la technologie SWC (Services
Without Components), apportée par COM + 1.5. Elle est accessible avec le
.NET Framework 1.1 par les classes ServiceConfig, ServiceDomain, etc...

Le gros avantage apporté par COM + 1.5 est que vous n'avez pas besoin de
"trafiquer" vos classes .NET, ni d'enregistrer des applications COM +.
L'impact est donc faible, mais le gain important.
plus d'infos ici:
http://weblogs.asp.net/dgonzalez/archive/2003/08/25/25274.aspx
http://msdn.microsoft.com/msdnmag/issues/02/04/COMXP/

Si vous ne souhaitez pas utiliser les transactions automatiques, alors il
faut soit passer par SQL comme vous le faites, soir passer un objet
transaction à chaque méthode, mais c'est nettement moins pratique.

Simon
www.softfluent.com


"Stéphane ANDRE" a écrit dans le
message de news: 074801c56c08$a0dd6810$
J'ai essayé, cela ne solutionne pas mon problème car même
si je passe mon objet transaction la connexion se fermant
suite au fill dans ma méthode j'ai le même pb.

-----Message d'origine-----
Pourquoi ne passerais-tu pas ton objet de transaction en


paramètre de ta
méthode.
Utilise éventuellement les throw pour renvoyer les


erreurs à la methode
appelante.



"Stéphane ANDRE" a écrit :

Bonjour,
Je me pose des questions concernant la gestion des
transaction avec ADO .Net et une base SQL Server. Que
conseillez-vous pour effectuer des transactions




imbriqués
avec ADO .Net?
Je m'explique, j'ai du code qui fait un ensemble
d'opérations de mise à jour de stock sur une séries
d'article et qui est donc composé d'une boucle




appellant
une méthode de mise à jour du stock. Dans cette




méthode je
souhaiterai démarrer une transaction et la cloturer




en fin
de méthode si tout s'est bien passé. Dans le code




appellant
je souhaiterai démarrer une transaction globale et la
valider si tous mes appels à ma méthode se sont bien




passé.
Les difficultés que je rencontre sont du au fait que
lorsque l'on fait un .Fill() la connexion est
automatiquement fermée et du coup les transactions
inutilisables. Actuellement j'utilise les donc, plutot




que
l'objet connection d'ADO .Net, les transactions




nommées de
SQL Server via des "BEGIN TRANSACTION MATRANSACTION"
exécutée via l'objet DataCommand d'ADO. Mais je me




pose
tout de même une question : est-ce que cela est




correct si
ma connexion est fermée par un .Fill alors qu'aucun




COMMIT
ou ROLLBACK n'est effectué. Que me conseillez-vous et




ou
puis-je trouver une doc vraiment explicite sur la




gestion
des transactions imbriquées avec ADO .NET ?

Merci d'avance.




.