Vraag TransactionScope en multi-threading


Ik vroeg me af hoe je de TransactionScope-klasse op de juiste manier zou gebruiken als je te maken hebt met multithreading?

We maken een nieuwe scope in onze hoofdthread en vervolgens sparen we een aantal worker-threads en we willen dat deze deelnemen aan het hoofdbereik, zodat bijvoorbeeld de rollback wordt aangeroepen voor elke worker als de scope nooit wordt voltooid.

Ik heb intern iets gelezen over TransactionScope met behulp van het ThreadStaticAttribute, waardoor het bovenstaande onmogelijk / zeer moeilijk was - kon iemand op welke manier dan ook verifiëren? Als we code op een gesynchroniseerde manier opraken, werken de rollbacks, d.w.z. de interne transacties kunnen deelnemen aan de hoofdtransactie, maar niet als we overschakelen naar een threaded uitvoering.

Bedankt


38
2018-03-23 14:15


oorsprong


antwoorden:


Zien MSDN:

U moet ook de TransactionScope en gebruiken   DependentTransaction-klasse voor   toepassingen die het gebruik van vereisen   dezelfde transactie over meerdere   functie-aanroepen of meerdere threads   noemt.

Dus misschien kijken DependentTransaction - in het bijzonder is er een worker thread-voorbeeld, hier.


28
2018-03-23 14:36



Dit klopt: de TransactionScope class gebruikt de Transaction.Current eigenschap die zijn waarde opslaat in het veld, dat is gemarkeerd met de ThreadStatic attribuut.

De ThreadStatic attribuut zorgt ervoor dat de veldwaarde draadaffiniteit krijgt, d.w.z. dat het een unieke waarde heeft in elke thread. Het is de aanbevolen aanpak om de datum te delen binnen een draad. Het is ook bekend als Discussie over lokale opslag (TLS).

De TransactionScope class definieert alleen een transactiecontext in de huidige thread. Het betekent echter niet dat jouw code moet alle taken in die thread uitvoeren. Ik kan me een complex berekeningsalgoritme voorstellen dat meerdere threads gebruikt.


17
2018-03-23 16:25