lundi 10 septembre 2012

Utilisation de Transaction avec Entity Framework 4 et Ninject pour une application Asp.Net MVC 3

Lorsque l'on a une application qui effectue de nombreux aller-retour avec la base de donnée il est important d'encapsuler les mêmes appels d'un processus dans une transaction. Ceci afin d'éviter d'avoir une applicaiton dans un état non prévu.

Exemple : vous insérer la Commande en base, et une erreur .net est levée dans le code qui insère les LigneCommande. Donc en base vous avez une commande sans lignes = état non prévu.

Dans mon projet actuel j'utilise Entity Framework 4, Asp.NetMVC 4 et Ninject pour l'injection de dépendance.

Tout se passe dans la config de ninject, je crée une transaction sql pour chaques requetes http et je rollback cette transaction si une erreur a été levée.

Donc ici on instantie le transactionscope sur OpenTransaction, en s'abonnant a l'evènement d'application Error pour faire un Rollback de la transaction en cas d'erreur.

EDIT : Attention à bien instancier le TransactionScope, il semblerai que la configuration de base lock la base (IsolationLevel.Serializable) et force un timeout de transaction faible (30 sec sachant qu'il y en a déjà un au niveau commande). Je m'en suis rendu compte en tentant de faire un select sur ma base (dans SSMS) en étant sur un point d'arret dans mon appli. Le select a fait un timeout à cause de cet isolation level.

Référence : http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx

Il faut donc mieux faire

new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TransactionManager.MaximumTimeout })

Aucun commentaire:

Enregistrer un commentaire