transacciones - transactionscope c# oracle
Cómo usar TransactionScope en C#? (7)
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.
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://www.portnine.com/data/images/Misc/client.jpg
Aquí están las propiedades en el servidor:
Servidor http://www.portnine.com/data/images/Misc/server.jpg
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.
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":
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 bloqueo, 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
}
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.
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.
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.
Tuve el mismo problema al ejecutar pruebas de integración.
He publicado una pregunta sobre esto here
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.