Когда Method1 ()
создает экземпляр TransactionScope
и вызывает Method2 ()
, который также создает экземпляр TransactionScope
, откуда .NET узнает, что оба находятся в одной области?
Я считаю, что он не использует статические методы внутри, иначе он не будет хорошо работать в многопоточных приложениях, таких как ASP.NET.
Можно ли создать мой собственный класс, похожий на TransactionScope, или же в оригинале используются специальные функции, которые только Microsoft знает, как они работают?
Надеюсь, это поможет:
http://msdn.microsoft.com/en-us/magazine/cc300805.aspx
Для тех, кто не знаком с TransactionScope, он является частью пространства имен System.Transactions, нового для Microsoft® .NET Framework 2.0. System.Transactions обеспечивает структуру транзакций, полностью интегрированную в .NET Framework, включая, но не ограничиваясь ADO.NET. Классы Transaction и TransactionScope являются двумя наиболее важными классами в этом пространстве имен. Как следует из вопроса, вы можете создать экземпляр TransactionScope, и операции ADO.NET, выполняемые в пределах области действия этого TransactionScope, будут зачислены автоматически (вы также можете получить доступ к текущей транзакции через статическое свойство Transaction.Current):
using(TransactionScope scope = new TransactionScope()) { ... // все операции здесь являются частью транзакции scope.Complete(); }
TransactionScope
в основном строится поверх COM - в частности, поверх MSDTC.
Это координирует транзакции и позволяет вложенность транзакций.
Короче говоря, когда вы впервые вызываете TransactionScope
, транзакция регистрируется в MSDTC, как и все остальные вызовы TransactionScope
. MSDTC координирует их все.