TransactionScope et le multi-threading
Je me demandais comment vous devez utiliser la classe TransactionScope dans la bonne voie lorsque vous faites affaire avec le multithreading?
Nous créer un nouveau champ d'application dans notre thread principal, puis nous frayer un couple de threads de travail et nous voulons que ces à participer dans le champ d'application principal, de sorte que, par exemple, la restauration est appelée sur chaque travailleur si la portée n'est jamais terminé.
J'ai lu quelque chose à propos de TransactionScope à l'aide de la ThreadStaticAttribute en interne qui fait le ci-dessus impossible ou très difficile - ce que quelqu'un pourrait vérifier de toute façon? Si nous exécuter le code dans un syncrhonized mode alors que les restaurations de travail, je.e les transactions internes sont en mesure de participer à l'opération principale, mais pas si nous passer à une exécution thread.
Grâce
- Bonne question; c'est un scénario que j'avais tout simplement rejeté comme "ne fais pas ça", mais après enquête, il ya un soutien via DependentTransaction. J'ai appris quelque chose, merci.
- C'est probablement vraiment obsolète info maintenant, en considérant que ce qui est décrit ici est maintenant considéré comme un bug, et TransactionScope a une nouvelle option permettant de circuler entre les async attend, qui aurait pour support multi-threading. particular.net/blog/...
Vous devez vous connecter pour publier un commentaire.
Voir MSDN:
Alors peut-être regarder dans
DependentTransaction
- en particulier, il y a un thread de travail exemple, ici.C'est exact: le
TransactionScope
classe utilise laTransaction.Current
propriété qui stocke sa valeur dans le champ, qui est marquée par laThreadStatic
attribut.La
ThreadStatic
attribut permet de s'assurer que la valeur de champ devient l'affinité de thread, c'est à dire qu'il a une valeur unique dans chaque thread. C'est l'approche recommandée pour partager date dans un thread. Il est également connu comme Thread Local Storage (TLS).La
TransactionScope
classe définit un contexte de transaction dans le thread courant. Cela ne veut pas dire, cependant, que votre code doit accomplir tout le travail dans ce thread. Je ne pouvais imaginer un complexe de calcul de l'algorithme qui utilise plusieurs threads.