2010-08-05 35 views
26

Cuando Method1() instancia un TransactionScope y llama a Method2() que también ejemplifica un TransactionScope, ¿cómo sabe .NET que ambos están en el mismo ámbito? Creo que no utiliza métodos estáticos internamente, de lo contrario no funcionaría bien en aplicaciones multiproceso como ASP.NET.¿Cómo funciona TransactionScope?

¿Es posible crear mi propia clase similar a TransactionScope o la original utiliza características especiales, solo las de Microsoft sabe cómo funcionan?

+2

un poco fuera de tema por lo que un comentario: los métodos estáticos no son un gran problema para multihebra, es DATOS estáticos que tiene que preocuparse –

Respuesta

15

Espero que esto ayude:

http://msdn.microsoft.com/en-us/magazine/cc300805.aspx

Para aquellos no familiarizados con TransactionScope, es parte de los System.Transactions los espacios de nombres nuevos en el Microsoft .NET Framework 2.0. System.Transactions proporciona un marco de transacciones totalmente integrado en .NET Framework, que incluye pero no se limita a ADO.NET. Las clases Transaction y TransactionScope son dos de las clases más importantes en este espacio de nombres. Como se hace alusión a la pregunta, puede crear una instancia de TransactionScope y las operaciones de ADO.NET ejecutadas dentro del alcance de ese TransactionScope se alistarán automáticamente (también puede acceder a la transacción actual a través de la propiedad estática Transaction.Current):

using(TransactionScope scope = new TransactionScope()) 
{ 
    ... // all operations here part of a transaction 
    scope.Complete(); 
} 
+0

¡Claro! También pueden usar Thread.SetData(): http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28SYSTEM.THREADING.THREAD.SETDATA%29;k% 28TargetFrameworkMoniker-% 22.NETFRAMEWORK% 2cVERSION% 3dV4.0% 22% 29; k% 28DevLang-CSHARP% 29 & rd = true – Eduardo

+2

El enlace ya no funciona. –

+0

@MiklX: eso es realmente malo, pruebe el [completo septiembre de 2006] (http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazineSeptember2006en-us.chm) problema. Lo veré mejor más tarde. –

8

TransactionScope prácticamente se basa en COM - específicamente en MSDTC.

Esto coordina las transacciones y permite anidar las transacciones.

En resumen, cuando llame por primera vez al TransactionScope, una transacción se registra con MSDTC, como lo harían todas las demás llamadas al TransactionScope. MSDTC los coordina a todos.

+2

A veces las transacciones (especialmente las de base de datos) se promueven a DTC pero no siempre. – Eduardo

+0

@Eduardo - eso es cierto. El LTM (Lightweight Transaction Manager) puede promover una transacción para distribuir a través de MSDTC. – Oded

Cuestiones relacionadas