3 votes

Réinitialiser le niveau d'isolation lors de l'utilisation de TransactionScope

Nous définissons le niveau d'isolation sur Non confirmé en lecture, comme indiqué ci-dessous.

    TransactionOptions to = new TransactionOptions();
    to.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew, to))
    {
       // Faire des choses
       transaction.Complete();
    }

Le problème est qu'une fois que la connexion est renvoyée au pool, elle n'est pas réinitialisée au niveau d'isolation par défaut, ce qui, je comprends, est intentionnel (Le niveau d'isolation de transaction n'est pas réinitialisé lorsque vous réutilisez une connexion depuis le pool de connexions). Ainsi, lorsque la transaction se termine, tout ce qui réutilise cette connexion depuis le pool sera exécuté avec le niveau d'isolation en lecture non confirmée.

J'ai essayé d'appeler "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" en utilisant un SqlCommand, mais il n'y a aucun moyen de garantir qu'il réutilisera la même connexion du pool. Rien dans // Faire des choses n'expose la connexion sous-jacente.

Existe-t-il un moyen de réinitialiser le niveau d'isolation sans le définir explicitement sur tous les appels à la base de données au cas où ce code aurait déjà été exécuté auparavant ?

5voto

Damien_The_Unbeliever Points 102139

Je utiliserais une chaîne de connexion différente (éventuellement une qui définit Pooling à false, ou simplement joue avec le Nom de l'Application) pour la connexion(s) que vous utilisez dans cette portée de transaction. De cette façon, cette connexion se retrouve dans un pool différent des autres connexions, et ne peut pas être accidentellement récupérée par un autre code.

2voto

usr Points 74796

Je me suis préoccupé de ce problème il y a un certain temps. En bref : il n'y a pas de bonne solution. Je considère maintenant comme une bonne pratique d'exécuter tout sous une transaction explicite car cela vous garantit un niveau d'isolation. N'utilisez jamais de transactions implicites.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X