Cómo usar TransactionScope en C #?

Intento usar TransactionScope , pero continúo recibiendo la excepción a continuación.
La aplicación se ejecuta en una máquina diferente de la base de datos, si eso es importante. Estoy usando SQL Server 2005.

El acceso a la red para Distributed Transaction Manager (MSDTC) se ha deshabilitado. Habilite DTC para el acceso a la red en la configuración de seguridad para MSDTC utilizando la herramienta administrativa de Servicios de componentes.

 using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); } 

Editar

Hice algunos cambios basados ​​en los comentarios. Ahora estoy obteniendo este error:

“Error HRESULT E_FAIL ha sido devuelto desde una llamada a un componente COM”.
“La comunicación con el administrador de transacciones subyacente ha fallado”.

Solución Creo que la respuesta aceptada solucionó el problema inicial que estaba obteniendo. El segundo error parece ser específico de Entity Framework. Voy a publicar otra pregunta para ello.

Aquí están las propiedades en el cliente:
Cliente http://sofes.miximages.com/c%23/client.jpg

Aquí están las propiedades en el servidor:
Servidor http://sofes.miximages.com/c%23/server.jpg

Debe habilitar el acceso a DTC de red como se describe en este artículo de Microsoft TechNet . Este cambio puede tener que hacerse tanto en la base de datos como en los servidores de aplicaciones. A menudo, DTC ya está encendido en un servidor de base de datos, así que primero miro al servidor de aplicaciones.

Aquí hay una captura de pantalla de lo que usamos a excepción de la opción “Permitir administración remota”: Captura de pantalla de configuración de seguridad

No me he encontrado con el problema HRESULT E_Fail que está teniendo ahora, pero este artículo sobre XP SP2 y las transacciones tuvo esta interesante sugerencia:

Otra configuración que debe tener en cuenta (aunque considero que es una situación poco común) es la clave de registro RestrictRemoteClients. Si el valor de esta clave se establece en 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH), las transacciones de red de MSDTC no podrán funcionar correctamente. MSDTC solo admite los valores RPC_RESTRICT_REMOTE_CLIENT_NONE (0) y RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1). Consulte http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 para obtener más información sobre RestrictRemoteClients.

Finalmente, aunque no es específico para su problema, una cosa muy importante a tener en cuenta sobre el uso de la clase TransactionScope es que su configuración predeterminada es utilizar un nivel de aislamiento de transacciones de Serializable . Serializable es el más restrictivo de los niveles de aislamiento y francamente es sorprendente que haya sido elegido como el predeterminado. Si no necesita este nivel de locking, le recomiendo encarecidamente establecer el nivel de aislamiento en una opción menos restrictiva (ReadCommitted) al crear una instancia de un TransactionScope :

 var scopeOptions = new TransactionOptions(); scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; scopeOptions.Timeout = TimeSpan.MaxValue; using (var scope = new TransactionScope(TransactionScopeOption.Required, scopeOptions)) { // your code here } 

Panel de control – Herramientas administrativas – Servicios de componentes – Propiedades de Mi PC – Pestaña MSDTC – Pestaña Configuración de seguridad – Acceso a DTC de red (marcado) / Permitir clientes remotos (marcado) / Permitir entrada (marcado) / Permitir saliente (marcado) / Habilitar transacciones TIP ( comprobado)

Reinicia la computadora.

Dependiendo del back-end que esté utilizando, TransactionScope a menudo requiere que se habilite el Administrador de transacciones distribuidas. Algunos detalles están en este blog de MSDN .

Además, si usa múltiples recursos, es posible que se requiera DTC. Es posible que se requiera habilitar DTC en su caso, o asegurarse de que esté utilizando SQL Server 2005 y apegarse a lo que sería factible en las transacciones livianas.

Debe habilitar DTC para el acceso a la red en la configuración de seguridad para MSDTC utilizando la herramienta administrativa de Servicios de componentes.

Si está utilizando SQL Server 2000, System.Transactions.TransactionScope hará que todas las transacciones se promocionen a Transacciones distribuidas, lo que requerirá que se ejecute MS Distributed Transaction Coordinator.

Puede solucionar esto iniciando el servicio MSDTC, actualizando a SQL Server 2005, o implementando algo como mi solución de proyecto de código: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

Nunca tuve la necesidad de hacerlo, pero también debería verificar la respuesta de Ocdecio para configurar la configuración de seguridad de la red para DTC.

Debe habilitar el acceso DTC de red tanto para el servidor de la base de datos como para el servidor donde se ejecuta la aplicación.

También deberá verificar que las conexiones no estén bloqueadas por un firewall. Como se iniciará una conexión desde el servidor de la base de datos a la máquina de la aplicación, es igualmente importante agregar MSDTC a la lista de excepciones de firewall en la máquina de la aplicación.

Tuve el mismo problema al ejecutar pruebas de integración.

He publicado una pregunta sobre esto aquí

pero finalmente encontré una forma de evitarlo. Aunque, no recomendaría hacer eso para el código de producción. Lo estaba haciendo en el contexto de las pruebas.