2010-02-16 7 views
14

Tenía curiosidad acerca de la clase TransactionScope.C# - System.Transactions.TransactionScope

En general, supongo que fue diseñado para conexiones de bases de datos (que es para lo que lo he usado).

Mi pregunta es, ¿puede poner cualquier código en el bloque de uso de un TransactionScope para hacerlo transaccional? La documentación de MS no es clara en esto.

Si se puede usar para hacer código que no sean conexiones de bases de datos transaccionales, ¿cuáles son compatibles? Me parecería una locura si pudiera hacer transacciones de System.IO.File.

+0

"Me parece una locura si pudiera hacer transacciones de System.IO.File transaccionales" - usted * puede * en Vista y más tarde a través de TxF - consulte http://alphafs.codeplex.com/. – Charles

+0

Una mejor pregunta puede ser "¿cuáles son compatibles automáticamente?" –

+0

Para su información, Microsoft está considerando anular la transacción NTFS http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx – Nathan

Respuesta

13

TransactionScope no es solo para las bases de datos. Todos los componentes que implementan la interfaz IEnlistmentNotification pueden participar en la confirmación en dos fases del alcance de la transacción.

Aquí es un ejemplo de almacenamiento transaccional en memoria: http://www.codeproject.com/KB/dotnet/Transactional_Repository.aspx

Además, no estoy seguro de si hay componentes de .NET para archivos transaccional IO, pero es bastante fácil de implementar dicho componente - Los últimos sistemas operativos como Vista y Windows Server 2008 tienen soporte para archivos de transacciones IO.

+2

Para su información, Microsoft está considerando cancelar NTFS transaccionales http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx – Nathan

6

No, no puede hacer código arbitrario transaccional ejecutándolo dentro de un TransactionScope.

Como mencionó en un comentario, el espacio de nombres System.Transactions proporciona infrastructure classes to help make any resource transactional. De forma predeterminada, .NET proporciona soporte de administrador de recursos para varios tipos de operaciones, enumeradas en la introducción del espacio de nombres que ha vinculado (en un comentario): "SQL Server, ADO.NET, MSMQ y el Coordinador de transacciones distribuidas de Microsoft (MSDTC)".

Resulta que hay soporte para las transacciones del sistema de archivos, aunque solo pude encontrarlo para NTFS (Enhance Your Apps With File System Transactions). Por mi dinero, ese código podría usar seriamente una fachada, sin embargo. ;) Quizás haya otras implementaciones más generalizadas (o tal vez no): hacer que el archivo IO transaccional requiera la infraestructura adicional que brinda NTFS).

También hay una buena cantidad de investigaciones en curso sobre la realización de cambios en el estado transaccional en memoria, llamado software transactional memory. Microsoft DevLabs ofrece una implementación: STM.NET.

+0

Ese proyecto parece que solo admite el trabajo con una estado transaccional en la memoria. Esto está lejos del soporte para hacer que todos los códigos sean transaccionales (como el System.IO que mencioné arriba). ¿Qué * acepta * TransactionScope además de las conexiones a la base de datos? – jonathanpeppers

+0

TransactionScope y Transactions son para bases de datos. ¿Para qué más se podrían usar? –

+0

Esta página menciona algunas otras cosas: http://msdn.microsoft.com/en-us/library/system.transactions.aspx, habla sobre su uso para otras cosas además de las bases de datos (MSMQ) y la capacidad de implementar un " Administrador de recursos". Entonces, ¿puedes implementar algo para hacer que otras cosas sean transaccionales? – jonathanpeppers