3

ARGH !!!SubSonic2.2 SharedDbConnectionScope et Confusion TransactionScope Transaction

Il semble y avoir un peu de confusion autour des objets SharedDbConnectionScope et TransactionScope pour activer l'encapsulation de vos requêtes SubSonic dans une transaction.

Les documents suggèrent l'utilisation de la spécification SharedDbConnectionScope enroulé autour de l'utilisation de TransactionScope ...

using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) 
{ 
    using(TransactionScope ts = new TransactionScope()) 
    { 
    // do something 
    ts.Complete(); 
    } 
} 

Alors autre question ici, comme Subsonic: Using SharedDbConnectionScope together with TransactionScope seems to be broken suggère les docs sont fausses et les deux objets devraient être l'inverse ..

using(TransactionScope ts = new TransactionScope()) 
{ 
    using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) 
    { 
    // do something 
    ts.Complete(); 
    } 
} 

Mais en regardant dans le code source, je suis encore plus confus.

Dans le fichier de code SqlQuery.cs, il contient un certain nombre de surcharges ExecuteTransaction. Par exemple ...

public static void ExecuteTransaction(List<SqlQuery> queries) 
{ 
    using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) 
    { 
    using(TransactionScope ts = new TransactionScope()) 
    { 
     foreach(SqlQuery q in queries) 
     q.Execute(); 
    } 
    } 
} 

Umm ... Intéressant ... Allumettes les docs, mais ... Où est le ts.Complete() appeler?

Comment cela est-il supposé valider la transaction? Autant que je puisse voir, ça va toujours revenir en arrière. Et c'est pareil pour toutes les surcharges d'ExecuteTransaction!

Mais voici le vrai pulseur ...

Dans le code TransactionWithDtcOffTests.cs a quelques tests agréable, sauf qu'ils ont mis en place le SharedDbConnectionScope et TransactionScope autour de l'autre façon!

using(TransactionScope ts = new TransactionScope()) 
{ 
    using(SharedDbConnectionScope connScope = new SharedDbConnectionScope()) 
    { 
    // <snip /> 
    } 
} 

Je n'ai pas eu l'occasion de lancer les tests sur SubSonic 2.2 mais je suppose que quelqu'un a passé et ils ..

Enfin ...

Quelqu'un peut-il me donner la réponse définitive à la façon dont les transactions dans SubSonic2.2 devraient être mis en place? Les documents sont-ils en effet erronés? La source des surcharges et des tests ExecuteTransaction est-elle alignée de la manière la plus correcte?

+0

Je ne peux pas suivre le problème - il y a environ 3 ici. Je comprends que vous êtes frustré :) mais je ne peux pas dire ce qui est confus par rapport à ce que vous pensez être un bug. –

+0

L'ordre de SharedDbConnectionScope (SDCS) et TransactionScope (TS) est le bit confus ou bogué. L'état docs SDCS encapsule le TS. Mais cela ne semble pas fonctionner. Donc c'est un bug. Les surcharges ExecuteTransaction ont SDCS enveloppant le TS donc c'est aussi un bug. Je ne pouvais pas voir où les surcharges étaient réellement commises, mais c'est peut-être parce que je n'ai pas regardé assez fort par opposition à un bug.Le code de test que j'ai regardé avait le TS enveloppant le SDCS. Donc, je conclus que ce n'est pas un bug. Le bit confus est l'emplacement de l'erreur. – BlackMael

+0

L'ordre de SDCS et TS est l'erreur ou est l'erreur dans SDCS lui-même et l'ordre dans les docs correct. Notez, pour mettre maintenant l'emballage de TS le SDCS fonctionne pour moi, où SDCS enveloppant le TS n'a pas fonctionné en termes de revenir en arrière quand il le devrait. – BlackMael

Répondre

4

Le bloc SharedConnectionScope (SCS) doit se trouver dans un TransactionScope (TS). Le but du SCS est d'empêcher l'escalade de la transaction vers le MSDTC si possible, de sorte que le fait que le TS utilise un bloc à l'intérieur d'un bloc utilisant SCS n'a pas beaucoup de sens pour moi. Dans tous les cas, chaque bloc TS doit avoir un appel Complete() pour que la transaction soit validée.

0

Personnellement, j'ai trouvé que lors de l'utilisation de SQL 2005, SCS doit être à l'intérieur de TS et lors de l'utilisation de SQL 2000 (avec MSDTC), SCS doit envelopper TS. J'espère que cela aide ...

Questions connexes