2009-05-20 4 views
6

Estoy usando .NET 2.0/3.5 framework para mi aplicación. Necesito ejecutar varios comandos SQL en múltiples conexiones y cada conexión está en un servidor diferente (Oracle, SQL Server). Necesito asegurarme de que estos comandos sean transaccionales.Múltiples comandos transaccionales de SQL en diferentes conexiones de base de datos

Por ejemplo: Necesito realizar un INSERTO en una tabla en ambas bases de datos de Oracle y SQL Server, y luego confirmarlas si no se lanzaron excepciones. Si hubo una excepción, me gustaría retroceder en ambos servidores si es necesario.

Sospecho que tendré que usar System.Transactions y TransactionScope. Esto requerirá que configure el Coordinador de transacciones distribuidas de Microsoft (MSDTC) en los servidores de bases de datos y también en el servidor de aplicaciones.

He visto alto y bajo y no pude encontrar ningún artículo que describa paso a paso la configuración de MSDTC con autenticación mutua (incluida la configuración del firewall y la configuración de MSDTC). Miré la documentación de Microsoft sobre la configuración de MSDTC, pero parece completamente inútil y no completamente documentado (a menos que pueda encontrarme un artículo realmente bueno de MSDN sobre cómo configurarlo).

¿Está utilizando MSDTC como la única forma de hacer mi trabajo?

Si es así, ¿cómo diablos configuro correctamente?

EDIT:

  • Estoy utilizando Windows Server 2003 para todas las máquinas.
  • Tengo dos servidores SQL. Uno es SQL Server 2000 y el otro es 2005.
  • Tengo un servidor Oracle y es la versión 11g
  • La aplicación que estamos desarrollando a veces debe alterar/crear registros en las tres bases de datos de forma transaccional.
  • No hay problema entre el teclado y la silla. Leemos los artículos en MSDN sobre cómo configurar todo lo relacionado con MSDTC, pero no podemos lograr que DTCPing y otras aplicaciones de prueba funcionen. Estábamos buscando un artículo paso a paso que detalla el proceso. Me he encontrado con la documentación de MSDN en más de una ocasión que los pasos "omitidos" para hacer ciertas cosas.

Respuesta

5

Tristemente, la documentación oficial de ambos proveedores parece feliz de mencionar el proveedor de interoperabilidad o el otro, pero ambos parecen reacios a reconocer la existencia de la oferta de base de datos de la otra.

Puede necesitar la documentación en Oracle Services for Microsoft Transaction Server.

  • Oracle Documentación: Existen versiones
    • 10g
    • 9i
    • mayores pero mucho parece haber cambiado después de 8

De ODP.NET 10.2.0.3 en adelante debe (si ha configurado correctamente MS DTC y el OraMTS dll está presente) podrá simplemente usar System.Transactions TransactionScope tal como lo haría si coordinara entre dos bases de datos SQL del servidor pero utilizando un servidor sql y una conexión Oracle. Es posible que se requiera Oracle 10 en adelante para que esto funcione simplemente de manera inmediata.

Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards. En particular, toma nota de los requisitos del sistema operativo (que en gran medida ya no es un problema, pero vale la pena señalar). Además, a menos que ambas bases de datos y el cliente estén en la misma máquina, entonces el DTC de la red debe estar habilitado.

1

Uso servidores vinculados para todas mis tareas de esta manera. Nos facilita la administración de la información de conexión y las credenciales. Básicamente, una parada para comprar todas nuestras necesidades.

Editar: más detalles - Tenemos una base de datos utilizada estrictamente para informar. Obtenemos nuestros datos del servidor en toda la corporación. No tenemos una sola cuenta para acceder a estos servidores, algunos de ellos utilizamos una identificación funcional, otras nuestras credenciales de AD. Envolver todas estas conexiones en servidores vinculados separados ha funcionado mejor para nosotros. En nuestro servidor de informes, actualmente tenemos 16 servidores vinculados.

También completamos nuestras consultas en vistas para un acceso más fácil a nuestras aplicaciones e informes de cristal. Entonces, en lugar de tener que crear múltiples cadenas de conexión en nuestro código, usamos una sola cadena global para conectarnos al Db de informes.

0

Este es un problema clásico de transacción distribuida y es para lo que es MSDTC. Busque monitores de transacción y el protocolo XA para una descripción más detallada de esta clase de problema.

0

Al usar conexiones múltiples, necesitará usar el DTC.Una sola conexión puede administrar una sola transacción, pero si tiene múltiples conexiones, necesitará un coordinador de transacciones para manejar el protocolo de confirmación en dos fases.

1

Mi respuesta podría ser un poco extraña, pero te recomendaré (si es técnicamente posible) evaluar el uso de 2 transacciones independientes para cada base de datos. Mi preocupación con respecto a las transacciones distribuidas/XA es el rendimiento/escalabilidad/latencia general de la base de datos.

2 enlaces que tratarán de demostrar mi punto de vista:.

  1. Martin Fowler notes: "Hay que prestar atención al orden de las confirmaciones, conseguir los más importantes en primer lugar en cada una de confirmar tiene que compruebe que tuvo éxito y decida qué hacer si falla ".
  2. Interview regarding eBay architecture
-1

Sí, usted tendrá que crear un ámbito de transacción y los proveedores de ADO.NET para SQL y Oracle se matricularán cada conexión en una sola transacción distribuida, coordinado por MSDTC.

La documentación de MSDN sobre cómo configurar MSDTC es bastante elaborada y cubre específicamente las preguntas que hace: Enable Firewall Exceptions for MS DTC, Configuring Security for Distributed Transactions.

Omite mencionar el sistema operativo que ejecuta su cliente, la versión de SQL Server, la versión de Oracle, el sistema operativo de fondo para SQL Server (s) y Oracle (s). También omite decir cualquier problema real que haya encontrado o un mensaje de error que haya visto. En este momento, el problema parece estar ubicado en algún lugar entre el teclado y la silla.

Cuestiones relacionadas