2009-04-27 12 views
34

Estoy tratando de usar TransactionScope, pero sigo 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 utilizando Servidor SQL 2005.¿Cómo uso TransactionScope en C#?

"Acceso a la red para Distributed Transaction Manager (MSDTC) se ha deshabilitado. Por favor, activa DTC para acceso a la red en la configuración de seguridad para MSDTC utilizando la herramienta administrativa Servicios de componentes."

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

Editar

he hecho algunos chagnes en base a la retroalimentación. Ahora estoy recibiendo este error:

{"Error HRESULT E_FAIL has been returned from a call to a COM component."} 
{"Communication with the underlying transaction manager has failed."} 

Solución Creo que la respuesta aceptada fija la emisión inicial que estaba recibiendo. El segundo error parece ser específico del marco de la entidad. Voy a publicar otra pregunta para ello.

Estas son las propiedades en el cliente: Client http://www.portnine.com/data/images/Misc/client.jpg

aquí son las propiedades del servidor:

Server http://www.portnine.com/data/images/Misc/server.jpg

+0

NotDan ¿todavía tiene las imágenes que había vinculado a correr? Si es así, sería genial volver a publicarlos para corregir el hecho de que actualmente son referencias de imágenes rotas. – ahsteele

Respuesta

31

Debe habilitar el acceso al DTC de la red como se describe en este Microsoft TechNet Article. 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í está una captura de pantalla de lo que usamos a excepción de la "Permitir la administración remota" opción: Security Configuration Screenshot

No se han encontrado con el problema HRESULT E_Fail que ahora está teniendo, pero este artículo en XP SP2 and transactions tenía esta interesante sugerencia:

Another configuration setting that you need to be aware (although I consider it to be an uncommon scenario) is RestrictRemoteClients registry key. If the value of this key is set to 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH) then MSDTC network transactions will not be able to work properly. MSDTC supports only RPC_RESTRICT_REMOTE_CLIENT_NONE (0) and RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1) values. See http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 for more info on RestrictRemoteClients.

Por último, aunque no es específica para su problema de una cosa muy importante a tener en cuenta sobre el uso de la clase TransactionScope es que su configuración por defecto es utilizar un Transaction Isolation Level of Serializable. Serializable es el más restrictivo de los niveles de aislamiento y francamente es sorprendente que haya sido elegido como el predeterminado. Si usted no necesita este nivel de bloqueo Recomiendo encarecidamente establecer el nivel de aislamiento en una opción menos restrictiva (ReadCommitted) cuando 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 
} 
+0

Me doy cuenta por la captura de pantalla que no está utilizando XP, pero pensé que podría aplicarse el artículo de XP SP2. – ahsteele

+0

Creo que esto solucionó el problema inicial que estaba recibiendo. El segundo error parece ser específico del marco de la entidad. Voy a publicar otra pregunta para ello. – NotDan

+2

Finalmente arreglé esto. Windows Firewall estaba bloqueando las conexiones a MS-DTC. – NotDan

0

Si está utilizando SQL Server 2000, System.Transactions.TransactionScope originen todas las transacciones se promocionarán a Transacciones distribuidas, lo que requerirá que se ejecute el Coordinador de transacciones distribuidas de Microsoft.

Puede solucionar este problema al iniciar el servicio MSDTC, la actualización a SQL Server 2005, o implementar algo así como mi solución CodeProject: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

nunca he necesitado hacerlo, pero también se debe comprobar la respuesta de Ocdecio de configurando la configuración de seguridad de red para DTC, también.

+0

Agregué una nota arriba, estoy usando Sql Server 2005 – NotDan

2

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

Reiniciar la computadora.

+0

gracias me faltaba la parte de reiniciar la computadora. – melaos

2

Dependiendo del back-end que esté utilizando, TransactionScope a menudo requiere que se habilite el Administrador de transacciones distribuidas. Algunos detalles son on this MSDN blog.

Además, si usa varios 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.

1

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

0

es necesario tener acceso DTC de red tanto para el servidor de base de datos y 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.

0

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

He publicado una pregunta sobre este here

pero finalmente he encontrado una manera alrededor de ella. Aunque, no recomendaría hacer eso para el código de producción. Lo estaba haciendo en el contexto de las pruebas.

Cuestiones relacionadas